suneditor 3.0.0-beta.2 → 3.0.0-beta.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 (177) hide show
  1. package/CONTRIBUTING.md +186 -184
  2. package/LICENSE +21 -21
  3. package/README.md +157 -180
  4. package/dist/suneditor.min.css +1 -1
  5. package/dist/suneditor.min.js +1 -1
  6. package/package.json +126 -123
  7. package/src/assets/design/color.css +131 -121
  8. package/src/assets/design/index.css +3 -3
  9. package/src/assets/design/size.css +37 -35
  10. package/src/assets/design/typography.css +37 -37
  11. package/src/assets/icons/defaultIcons.js +247 -232
  12. package/src/assets/suneditor-contents.css +779 -778
  13. package/src/assets/suneditor.css +43 -35
  14. package/src/core/base/eventHandlers/handler_toolbar.js +135 -135
  15. package/src/core/base/eventHandlers/handler_ww_clipboard.js +56 -56
  16. package/src/core/base/eventHandlers/handler_ww_dragDrop.js +115 -113
  17. package/src/core/base/eventHandlers/handler_ww_key_input.js +1200 -1200
  18. package/src/core/base/eventHandlers/handler_ww_mouse.js +194 -194
  19. package/src/core/base/eventManager.js +1550 -1484
  20. package/src/core/base/history.js +355 -355
  21. package/src/core/class/char.js +163 -162
  22. package/src/core/class/component.js +856 -842
  23. package/src/core/class/format.js +3433 -3422
  24. package/src/core/class/html.js +1927 -1890
  25. package/src/core/class/menu.js +357 -346
  26. package/src/core/class/nodeTransform.js +424 -424
  27. package/src/core/class/offset.js +858 -891
  28. package/src/core/class/selection.js +710 -620
  29. package/src/core/class/shortcuts.js +98 -98
  30. package/src/core/class/toolbar.js +438 -430
  31. package/src/core/class/ui.js +424 -422
  32. package/src/core/class/viewer.js +750 -750
  33. package/src/core/editor.js +1810 -1708
  34. package/src/core/section/actives.js +268 -241
  35. package/src/core/section/constructor.js +1348 -1661
  36. package/src/core/section/context.js +102 -102
  37. package/src/core/section/documentType.js +582 -561
  38. package/src/core/section/options.js +367 -0
  39. package/src/core/util/instanceCheck.js +59 -0
  40. package/src/editorInjector/_classes.js +36 -36
  41. package/src/editorInjector/_core.js +92 -92
  42. package/src/editorInjector/index.js +75 -75
  43. package/src/events.js +634 -622
  44. package/src/helper/clipboard.js +59 -59
  45. package/src/helper/converter.js +586 -564
  46. package/src/helper/dom/domCheck.js +304 -304
  47. package/src/helper/dom/domQuery.js +677 -669
  48. package/src/helper/dom/domUtils.js +618 -557
  49. package/src/helper/dom/index.js +12 -12
  50. package/src/helper/env.js +249 -240
  51. package/src/helper/index.js +25 -25
  52. package/src/helper/keyCodeMap.js +183 -183
  53. package/src/helper/numbers.js +72 -72
  54. package/src/helper/unicode.js +47 -47
  55. package/src/langs/ckb.js +231 -231
  56. package/src/langs/cs.js +231 -231
  57. package/src/langs/da.js +231 -231
  58. package/src/langs/de.js +231 -231
  59. package/src/langs/en.js +230 -230
  60. package/src/langs/es.js +231 -231
  61. package/src/langs/fa.js +231 -231
  62. package/src/langs/fr.js +231 -231
  63. package/src/langs/he.js +231 -231
  64. package/src/langs/hu.js +230 -230
  65. package/src/langs/index.js +28 -28
  66. package/src/langs/it.js +231 -231
  67. package/src/langs/ja.js +230 -230
  68. package/src/langs/km.js +230 -230
  69. package/src/langs/ko.js +230 -230
  70. package/src/langs/lv.js +231 -231
  71. package/src/langs/nl.js +231 -231
  72. package/src/langs/pl.js +231 -231
  73. package/src/langs/pt_br.js +231 -231
  74. package/src/langs/ro.js +231 -231
  75. package/src/langs/ru.js +231 -231
  76. package/src/langs/se.js +231 -231
  77. package/src/langs/tr.js +231 -231
  78. package/src/langs/uk.js +231 -231
  79. package/src/langs/ur.js +231 -231
  80. package/src/langs/zh_cn.js +231 -231
  81. package/src/modules/ApiManager.js +191 -191
  82. package/src/modules/Browser.js +669 -667
  83. package/src/modules/ColorPicker.js +364 -362
  84. package/src/modules/Controller.js +474 -454
  85. package/src/modules/Figure.js +1620 -1617
  86. package/src/modules/FileManager.js +359 -359
  87. package/src/modules/HueSlider.js +577 -565
  88. package/src/modules/Modal.js +346 -346
  89. package/src/modules/ModalAnchorEditor.js +643 -643
  90. package/src/modules/SelectMenu.js +549 -549
  91. package/src/modules/_DragHandle.js +17 -17
  92. package/src/modules/index.js +14 -14
  93. package/src/plugins/browser/audioGallery.js +83 -83
  94. package/src/plugins/browser/fileBrowser.js +103 -103
  95. package/src/plugins/browser/fileGallery.js +83 -83
  96. package/src/plugins/browser/imageGallery.js +81 -81
  97. package/src/plugins/browser/videoGallery.js +103 -103
  98. package/src/plugins/command/blockquote.js +61 -60
  99. package/src/plugins/command/exportPDF.js +134 -134
  100. package/src/plugins/command/fileUpload.js +456 -456
  101. package/src/plugins/command/list_bulleted.js +149 -148
  102. package/src/plugins/command/list_numbered.js +152 -151
  103. package/src/plugins/dropdown/align.js +157 -155
  104. package/src/plugins/dropdown/backgroundColor.js +108 -104
  105. package/src/plugins/dropdown/font.js +141 -137
  106. package/src/plugins/dropdown/fontColor.js +109 -105
  107. package/src/plugins/dropdown/formatBlock.js +170 -178
  108. package/src/plugins/dropdown/hr.js +152 -152
  109. package/src/plugins/dropdown/layout.js +83 -83
  110. package/src/plugins/dropdown/lineHeight.js +131 -130
  111. package/src/plugins/dropdown/list.js +123 -122
  112. package/src/plugins/dropdown/paragraphStyle.js +138 -138
  113. package/src/plugins/dropdown/table.js +4110 -4000
  114. package/src/plugins/dropdown/template.js +83 -83
  115. package/src/plugins/dropdown/textStyle.js +149 -149
  116. package/src/plugins/field/mention.js +242 -242
  117. package/src/plugins/index.js +120 -120
  118. package/src/plugins/input/fontSize.js +414 -410
  119. package/src/plugins/input/pageNavigator.js +71 -70
  120. package/src/plugins/modal/audio.js +677 -677
  121. package/src/plugins/modal/drawing.js +537 -531
  122. package/src/plugins/modal/embed.js +886 -886
  123. package/src/plugins/modal/image.js +1377 -1376
  124. package/src/plugins/modal/link.js +248 -240
  125. package/src/plugins/modal/math.js +563 -563
  126. package/src/plugins/modal/video.js +1226 -1226
  127. package/src/plugins/popup/anchor.js +224 -222
  128. package/src/suneditor.js +114 -107
  129. package/src/themes/dark.css +132 -122
  130. package/src/typedef.js +132 -130
  131. package/types/assets/icons/defaultIcons.d.ts +8 -0
  132. package/types/core/base/eventManager.d.ts +29 -4
  133. package/types/core/class/char.d.ts +2 -1
  134. package/types/core/class/component.d.ts +1 -2
  135. package/types/core/class/format.d.ts +8 -1
  136. package/types/core/class/html.d.ts +8 -0
  137. package/types/core/class/menu.d.ts +8 -0
  138. package/types/core/class/offset.d.ts +24 -26
  139. package/types/core/class/selection.d.ts +2 -0
  140. package/types/core/class/toolbar.d.ts +6 -0
  141. package/types/core/class/ui.d.ts +1 -1
  142. package/types/core/editor.d.ts +34 -12
  143. package/types/core/section/constructor.d.ts +5 -638
  144. package/types/core/section/documentType.d.ts +12 -2
  145. package/types/core/section/options.d.ts +740 -0
  146. package/types/core/util/instanceCheck.d.ts +50 -0
  147. package/types/editorInjector/_core.d.ts +5 -5
  148. package/types/editorInjector/index.d.ts +2 -2
  149. package/types/events.d.ts +2 -0
  150. package/types/helper/converter.d.ts +9 -0
  151. package/types/helper/dom/domQuery.d.ts +5 -5
  152. package/types/helper/dom/domUtils.d.ts +8 -0
  153. package/types/helper/env.d.ts +6 -1
  154. package/types/helper/index.d.ts +4 -1
  155. package/types/index.d.ts +122 -120
  156. package/types/langs/_Lang.d.ts +194 -194
  157. package/types/modules/ColorPicker.d.ts +5 -1
  158. package/types/modules/Controller.d.ts +8 -4
  159. package/types/modules/Figure.d.ts +2 -1
  160. package/types/modules/HueSlider.d.ts +4 -1
  161. package/types/modules/SelectMenu.d.ts +1 -1
  162. package/types/plugins/command/blockquote.d.ts +1 -0
  163. package/types/plugins/command/list_bulleted.d.ts +1 -0
  164. package/types/plugins/command/list_numbered.d.ts +1 -0
  165. package/types/plugins/dropdown/align.d.ts +1 -0
  166. package/types/plugins/dropdown/backgroundColor.d.ts +1 -0
  167. package/types/plugins/dropdown/font.d.ts +1 -0
  168. package/types/plugins/dropdown/fontColor.d.ts +1 -0
  169. package/types/plugins/dropdown/formatBlock.d.ts +3 -2
  170. package/types/plugins/dropdown/lineHeight.d.ts +1 -0
  171. package/types/plugins/dropdown/list.d.ts +1 -0
  172. package/types/plugins/dropdown/table.d.ts +6 -0
  173. package/types/plugins/input/fontSize.d.ts +1 -0
  174. package/types/plugins/modal/drawing.d.ts +4 -0
  175. package/types/plugins/modal/link.d.ts +32 -15
  176. package/types/suneditor.d.ts +13 -9
  177. package/types/typedef.d.ts +8 -0
@@ -1,178 +1,170 @@
1
- import EditorInjector from '../../editorInjector';
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';
21
-
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;
33
-
34
- // create HTML
35
- const menu = CreateHTML(editor, pluginOptions.items);
36
-
37
- // members
38
- this.formatList = menu.querySelectorAll('li button');
39
- this.currentFormat = '';
40
-
41
- // init
42
- this.menu.initDropdownTarget(FormatBlock, menu);
43
- }
44
-
45
- /**
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
51
- */
52
- active(element, target) {
53
- let formatTitle = this.lang.formats;
54
- const targetText = target.querySelector('.se-txt');
55
-
56
- if (!element) {
57
- dom.utils.changeTxt(targetText, formatTitle);
58
- } else if (this.format.isLine(element)) {
59
- const formatList = this.formatList;
60
- const nodeName = element.nodeName.toLowerCase();
61
- const className = (element.className.match(/(\s|^)__se__format__[^\s]+/) || [''])[0].trim();
62
-
63
- for (let i = 0, len = formatList.length, f; i < len; i++) {
64
- f = /** @type {HTMLButtonElement} */ (formatList[i]);
65
- if (nodeName === f.getAttribute('data-value') && className === f.getAttribute('data-class')) {
66
- formatTitle = f.title;
67
- break;
68
- }
69
- }
70
-
71
- dom.utils.changeTxt(targetText, formatTitle);
72
- targetText.setAttribute('data-value', nodeName);
73
- targetText.setAttribute('data-class', className);
74
-
75
- return true;
76
- }
77
-
78
- return false;
79
- }
80
-
81
- /**
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
85
- */
86
- on(target) {
87
- const formatList = this.formatList;
88
- const targetText = target.querySelector('.se-txt');
89
- const currentFormat = (targetText.getAttribute('data-value') || '') + (targetText.getAttribute('data-class') || '');
90
-
91
- if (currentFormat !== this.currentFormat) {
92
- for (let i = 0, len = formatList.length, f; i < len; i++) {
93
- f = formatList[i];
94
- if (currentFormat === f.getAttribute('data-value') + f.getAttribute('data-class')) {
95
- dom.utils.addClass(f, 'active');
96
- } else {
97
- dom.utils.removeClass(f, 'active');
98
- }
99
- }
100
-
101
- this.currentFormat = currentFormat;
102
- }
103
- }
104
-
105
- /**
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
110
- */
111
- action(target) {
112
- // "line"|"br-line"|"block"
113
- const command = target.getAttribute('data-command');
114
- const tag = target.firstElementChild;
115
- if (command === 'block') {
116
- this.format.applyBlock(tag);
117
- } else if (command === 'br-line') {
118
- this.format.setBrLine(tag);
119
- } else {
120
- this.format.setLine(tag);
121
- }
122
-
123
- this.menu.dropdownOff();
124
- }
125
-
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
- }
137
-
138
- function CreateHTML({ lang }, items) {
139
- const defaultFormats = ['p', 'blockquote', 'pre', 'h1', 'h2', 'h3', 'h4', 'h5', 'h6'];
140
- const formatList = !items || items.length === 0 ? defaultFormats : items;
141
-
142
- let list = /*html*/ `
143
- <div class="se-list-inner">
144
- <ul class="se-list-basic">`;
145
-
146
- for (let i = 0, len = formatList.length, format, tagName, command, name, h, attrs, className; i < len; i++) {
147
- format = formatList[i];
148
-
149
- if (typeof format === 'string' && defaultFormats.includes(format)) {
150
- tagName = format.toLowerCase();
151
- command = tagName === 'blockquote' ? 'block' : tagName === 'pre' ? 'br-line' : 'line';
152
- h = /^h/.test(tagName) ? tagName.match(/\d+/)[0] : '';
153
- name = lang['tag_' + (h ? 'h' : tagName)] + h;
154
- className = '';
155
- attrs = '';
156
- } else {
157
- tagName = format.tag.toLowerCase();
158
- command = format.command;
159
- name = format.name || tagName;
160
- className = format.class;
161
- attrs = className ? ' class="' + className + '"' : '';
162
- }
163
-
164
- list += /*html*/ `
165
- <li>
166
- <button type="button" class="se-btn se-btn-list" data-command="${command}" data-value="${tagName}" data-class="${className}" title="${name}" aria-label="${name}">
167
- <${tagName}${attrs}>${name}</${tagName}>
168
- </button>
169
- </li>`;
170
- }
171
- list += /*html*/ `
172
- </ul>
173
- </div>`;
174
-
175
- return dom.utils.createElement('DIV', { class: 'se-dropdown se-list-layer se-list-format' }, list);
176
- }
177
-
178
- export default FormatBlock;
1
+ import EditorInjector from '../../editorInjector';
2
+ import { dom } from '../../helper';
3
+
4
+ /**
5
+ * @class
6
+ * @description FormatBlock Plugin (P, BLOCKQUOTE, PRE, H1, H2...)
7
+ */
8
+ class FormatBlock extends EditorInjector {
9
+ static key = 'formatBlock';
10
+ static type = 'dropdown';
11
+ static className = 'se-btn-select se-btn-tool-format';
12
+
13
+ /**
14
+ * @constructor
15
+ * @param {__se__EditorCore} editor - The root editor instance
16
+ * @param {Object} pluginOptions
17
+ * @param {Array<string>} pluginOptions.items - Format list
18
+ */
19
+ constructor(editor, pluginOptions) {
20
+ super(editor);
21
+ // plugin basic properties
22
+ this.title = this.lang.formats;
23
+ this.inner = '<span class="se-txt">' + this.lang.formats + '</span>' + this.icons.arrow_down;
24
+
25
+ // create HTML
26
+ const menu = CreateHTML(editor, pluginOptions.items);
27
+
28
+ // members
29
+ this.formatList = menu.querySelectorAll('li button');
30
+ this.currentFormat = '';
31
+
32
+ // init
33
+ this.menu.initDropdownTarget(FormatBlock, menu);
34
+ }
35
+
36
+ /**
37
+ * @editorMethod Editor.EventManager
38
+ * @description Executes the method that is called whenever the cursor position changes.
39
+ * @param {?HTMLElement=} element - Node element where the cursor is currently located
40
+ * @param {?HTMLElement=} target - The plugin's toolbar button element
41
+ * @returns {boolean} - Whether the plugin is active
42
+ * - If it returns "undefined", it will no longer be called in this scope.
43
+ */
44
+ active(element, target) {
45
+ let formatTitle = this.lang.formats;
46
+ const targetText = target.querySelector('.se-txt');
47
+
48
+ if (!element) {
49
+ dom.utils.changeTxt(targetText, formatTitle);
50
+ } else if (this.format.isLine(element)) {
51
+ const formatList = this.formatList;
52
+ const nodeName = element.nodeName.toLowerCase();
53
+ const className = (element.className.match(/(\s|^)__se__format__[^\s]+/) || [''])[0].trim();
54
+
55
+ for (let i = 0, len = formatList.length, f; i < len; i++) {
56
+ f = /** @type {HTMLButtonElement} */ (formatList[i]);
57
+ if (nodeName === f.getAttribute('data-value') && className === f.getAttribute('data-class')) {
58
+ formatTitle = f.title;
59
+ break;
60
+ }
61
+ }
62
+
63
+ dom.utils.changeTxt(targetText, formatTitle);
64
+ targetText.setAttribute('data-value', nodeName);
65
+ targetText.setAttribute('data-class', className);
66
+
67
+ return true;
68
+ }
69
+
70
+ return false;
71
+ }
72
+
73
+ /**
74
+ * @editorMethod Modules.Dropdown
75
+ * @description Executes the method that is called when a plugin's dropdown menu is opened.
76
+ * @param {HTMLElement} target Line element at the current cursor position
77
+ */
78
+ on(target) {
79
+ const formatList = this.formatList;
80
+ const targetText = target.querySelector('.se-txt');
81
+ const currentFormat = (targetText.getAttribute('data-value') || '') + (targetText.getAttribute('data-class') || '');
82
+
83
+ if (currentFormat !== this.currentFormat) {
84
+ for (let i = 0, len = formatList.length, f; i < len; i++) {
85
+ f = formatList[i];
86
+ if (currentFormat === f.getAttribute('data-value') + f.getAttribute('data-class')) {
87
+ dom.utils.addClass(f, 'active');
88
+ } else {
89
+ dom.utils.removeClass(f, 'active');
90
+ }
91
+ }
92
+
93
+ this.currentFormat = currentFormat;
94
+ }
95
+ }
96
+
97
+ /**
98
+ * @editorMethod Editor.core
99
+ * @description Executes the main execution method of the plugin.
100
+ * - Called when an item in the "dropdown" menu is clicked.
101
+ * @param {HTMLElement} target - The plugin's toolbar button element
102
+ */
103
+ action(target) {
104
+ // "line"|"br-line"|"block"
105
+ const command = target.getAttribute('data-command');
106
+ const tag = target.firstElementChild;
107
+ if (command === 'block') {
108
+ this.format.applyBlock(tag);
109
+ } else if (command === 'br-line') {
110
+ this.format.setBrLine(tag);
111
+ } else {
112
+ this.format.setLine(tag);
113
+ }
114
+
115
+ this.menu.dropdownOff();
116
+ }
117
+
118
+ /**
119
+ * @description Create a header tag, call by "shortcut" class
120
+ * - (e.g. shortcuts._h1: ['c+s+49+$~formatBlock.applyHeaderByShortcut', ''])
121
+ * @param {__se__PluginShortcutInfo} params - Information of the "shortcut" plugin
122
+ */
123
+ applyHeaderByShortcut({ keyCode }) {
124
+ const headerNum = keyCode.match(/\d+$/)?.[0];
125
+ const tag = dom.utils.createElement(`H${headerNum}`);
126
+ this.format.setLine(tag);
127
+ }
128
+ }
129
+
130
+ function CreateHTML({ lang }, items) {
131
+ const defaultFormats = ['p', 'blockquote', 'pre', 'h1', 'h2', 'h3', 'h4', 'h5', 'h6'];
132
+ const formatList = !items || items.length === 0 ? defaultFormats : items;
133
+
134
+ let list = /*html*/ `
135
+ <div class="se-list-inner">
136
+ <ul class="se-list-basic">`;
137
+
138
+ for (let i = 0, len = formatList.length, format, tagName, command, name, h, attrs, className; i < len; i++) {
139
+ format = formatList[i];
140
+
141
+ if (typeof format === 'string' && defaultFormats.includes(format)) {
142
+ tagName = format.toLowerCase();
143
+ command = tagName === 'blockquote' ? 'block' : tagName === 'pre' ? 'br-line' : 'line';
144
+ h = /^h/.test(tagName) ? tagName.match(/\d+/)[0] : '';
145
+ name = lang['tag_' + (h ? 'h' : tagName)] + h;
146
+ className = '';
147
+ attrs = '';
148
+ } else {
149
+ tagName = format.tag.toLowerCase();
150
+ command = format.command;
151
+ name = format.name || tagName;
152
+ className = format.class;
153
+ attrs = className ? ' class="' + className + '"' : '';
154
+ }
155
+
156
+ list += /*html*/ `
157
+ <li>
158
+ <button type="button" class="se-btn se-btn-list" data-command="${command}" data-value="${tagName}" data-class="${className}" title="${name}" aria-label="${name}">
159
+ <${tagName}${attrs}>${name}</${tagName}>
160
+ </button>
161
+ </li>`;
162
+ }
163
+ list += /*html*/ `
164
+ </ul>
165
+ </div>`;
166
+
167
+ return dom.utils.createElement('DIV', { class: 'se-dropdown se-list-layer se-list-format' }, list);
168
+ }
169
+
170
+ export default FormatBlock;
@@ -1,152 +1,152 @@
1
- import EditorInjector from '../../editorInjector';
2
- import { dom } from '../../helper';
3
-
4
- /**
5
- * @class
6
- * @description HR Plugin
7
- */
8
- class HR extends EditorInjector {
9
- static key = 'hr';
10
- static type = 'dropdown';
11
- static className = '';
12
- /**
13
- * @this {HR}
14
- * @param {HTMLElement} node - The node to check.
15
- * @returns {HTMLElement|null} Returns a node if the node is a valid component.
16
- */
17
- static component(node) {
18
- return /^hr$/i.test(node?.nodeName) ? node : null;
19
- }
20
-
21
- /**
22
- * @constructor
23
- * @param {__se__EditorCore} editor - The root editor instance
24
- * @param {Object} pluginOptions
25
- * @param {Array<{name: string, class: string}>} pluginOptions.items - HR list
26
- */
27
- constructor(editor, pluginOptions) {
28
- // plugin bisic properties
29
- super(editor);
30
- this.title = this.lang.horizontalLine;
31
- this.icon = 'horizontal_line';
32
-
33
- // create HTML
34
- const HRMenus = CreateHTML(editor, pluginOptions.items);
35
-
36
- // members
37
- this.list = HRMenus.querySelectorAll('button');
38
-
39
- // init
40
- this.menu.initDropdownTarget(HR, HRMenus);
41
- }
42
-
43
- /**
44
- * @editorMethod Editor.Component
45
- * @description Executes the method that is called when a component of a plugin is selected.
46
- * @param {HTMLElement} target Target component element
47
- */
48
- select(target) {
49
- dom.utils.addClass(target, 'on');
50
- }
51
-
52
- /**
53
- * @editorMethod Editor.Component
54
- * @description Called when a container is deselected.
55
- * @param {HTMLElement} element Target element
56
- */
57
- deselect(element) {
58
- dom.utils.removeClass(element, 'on');
59
- }
60
-
61
- /**
62
- * @editorMethod Editor.Component
63
- * @description Method to delete a component of a plugin, called by the "FileManager", "Controller" module.
64
- * @param {HTMLElement} target Target element
65
- */
66
- destroy(target) {
67
- if (!target) return;
68
-
69
- const focusEl = target.previousElementSibling || target.nextElementSibling;
70
- dom.utils.removeItem(target);
71
-
72
- // focus
73
- this.editor.focusEdge(focusEl);
74
- this.history.push(false);
75
- }
76
-
77
- /**
78
- * @editorMethod Editor.core
79
- * @description Executes the main execution method of the plugin.
80
- * - Called when an item in the "dropdown" menu is clicked.
81
- * @param {HTMLElement} target - The plugin's toolbar button element
82
- */
83
- action(target) {
84
- const hr = this.submit(target.firstElementChild.className);
85
- const line = this.format.addLine(hr);
86
- this.selection.setRange(line, 1, line, 1);
87
- this.menu.dropdownOff();
88
- }
89
-
90
- /**
91
- * @editorMethod Editor.core
92
- * @description Executes methods called by shortcut keys.
93
- * @param {__se__PluginShortcutInfo} params - Information of the "shortcut" plugin
94
- */
95
- shortcut({ line, range }) {
96
- const newLine = this.nodeTransform.split(range.endContainer, range.endOffset, 0);
97
- this.submit('__se__solid');
98
- dom.utils.removeItem(line);
99
- this.selection.setRange(newLine, 0, newLine, 0);
100
- }
101
-
102
- /**
103
- * @description Add a hr element
104
- * @param {string} className HR class name
105
- */
106
- submit(className) {
107
- const hr = dom.utils.createElement('hr', { class: className });
108
- this.editor.focus();
109
- this.component.insert(hr, { skipCharCount: false, skipSelection: true, skipHistory: false });
110
- return hr;
111
- }
112
- }
113
-
114
- function CreateHTML({ lang }, HRItems) {
115
- const items = HRItems || [
116
- {
117
- name: lang.hr_solid,
118
- class: '__se__solid'
119
- },
120
- {
121
- name: lang.hr_dashed,
122
- class: '__se__dashed'
123
- },
124
- {
125
- name: lang.hr_dotted,
126
- class: '__se__dotted'
127
- }
128
- ];
129
-
130
- let list = '';
131
- for (let i = 0, len = items.length; i < len; i++) {
132
- list += /*html*/ `
133
- <li>
134
- <button type="button" class="se-btn se-btn-list" data-command="hr" title="${items[i].name}" aria-label="${items[i].name}">
135
- <hr${items[i].class ? ` class="${items[i].class}"` : ''}${items[i].style ? ` style="${items[i].style}"` : ''}/>
136
- </button>
137
- </li>`;
138
- }
139
-
140
- return dom.utils.createElement(
141
- 'DIV',
142
- {
143
- class: 'se-dropdown se-list-layer se-list-line'
144
- },
145
- /*html*/ `
146
- <div class="se-list-inner">
147
- <ul class="se-list-basic">${list}</ul>
148
- </div>`
149
- );
150
- }
151
-
152
- export default HR;
1
+ import EditorInjector from '../../editorInjector';
2
+ import { dom } from '../../helper';
3
+
4
+ /**
5
+ * @class
6
+ * @description HR Plugin
7
+ */
8
+ class HR extends EditorInjector {
9
+ static key = 'hr';
10
+ static type = 'dropdown';
11
+ static className = '';
12
+ /**
13
+ * @this {HR}
14
+ * @param {HTMLElement} node - The node to check.
15
+ * @returns {HTMLElement|null} Returns a node if the node is a valid component.
16
+ */
17
+ static component(node) {
18
+ return /^hr$/i.test(node?.nodeName) ? node : null;
19
+ }
20
+
21
+ /**
22
+ * @constructor
23
+ * @param {__se__EditorCore} editor - The root editor instance
24
+ * @param {Object} pluginOptions
25
+ * @param {Array<{name: string, class: string}>} pluginOptions.items - HR list
26
+ */
27
+ constructor(editor, pluginOptions) {
28
+ // plugin bisic properties
29
+ super(editor);
30
+ this.title = this.lang.horizontalLine;
31
+ this.icon = 'horizontal_line';
32
+
33
+ // create HTML
34
+ const HRMenus = CreateHTML(editor, pluginOptions.items);
35
+
36
+ // members
37
+ this.list = HRMenus.querySelectorAll('button');
38
+
39
+ // init
40
+ this.menu.initDropdownTarget(HR, HRMenus);
41
+ }
42
+
43
+ /**
44
+ * @editorMethod Editor.Component
45
+ * @description Executes the method that is called when a component of a plugin is selected.
46
+ * @param {HTMLElement} target Target component element
47
+ */
48
+ select(target) {
49
+ dom.utils.addClass(target, 'on');
50
+ }
51
+
52
+ /**
53
+ * @editorMethod Editor.Component
54
+ * @description Called when a container is deselected.
55
+ * @param {HTMLElement} element Target element
56
+ */
57
+ deselect(element) {
58
+ dom.utils.removeClass(element, 'on');
59
+ }
60
+
61
+ /**
62
+ * @editorMethod Editor.Component
63
+ * @description Method to delete a component of a plugin, called by the "FileManager", "Controller" module.
64
+ * @param {HTMLElement} target Target element
65
+ */
66
+ destroy(target) {
67
+ if (!target) return;
68
+
69
+ const focusEl = target.previousElementSibling || target.nextElementSibling;
70
+ dom.utils.removeItem(target);
71
+
72
+ // focus
73
+ this.editor.focusEdge(focusEl);
74
+ this.history.push(false);
75
+ }
76
+
77
+ /**
78
+ * @editorMethod Editor.core
79
+ * @description Executes the main execution method of the plugin.
80
+ * - Called when an item in the "dropdown" menu is clicked.
81
+ * @param {HTMLElement} target - The plugin's toolbar button element
82
+ */
83
+ action(target) {
84
+ const hr = this.submit(target.firstElementChild.className);
85
+ const line = this.format.addLine(hr);
86
+ this.selection.setRange(line, 1, line, 1);
87
+ this.menu.dropdownOff();
88
+ }
89
+
90
+ /**
91
+ * @editorMethod Editor.core
92
+ * @description Executes methods called by shortcut keys.
93
+ * @param {__se__PluginShortcutInfo} params - Information of the "shortcut" plugin
94
+ */
95
+ shortcut({ line, range }) {
96
+ const newLine = this.nodeTransform.split(range.endContainer, range.endOffset, 0);
97
+ this.submit('__se__solid');
98
+ dom.utils.removeItem(line);
99
+ this.selection.setRange(newLine, 0, newLine, 0);
100
+ }
101
+
102
+ /**
103
+ * @description Add a hr element
104
+ * @param {string} className HR class name
105
+ */
106
+ submit(className) {
107
+ const hr = dom.utils.createElement('hr', { class: className });
108
+ this.editor.focus();
109
+ this.component.insert(hr, { skipCharCount: false, skipSelection: true, skipHistory: false });
110
+ return hr;
111
+ }
112
+ }
113
+
114
+ function CreateHTML({ lang }, HRItems) {
115
+ const items = HRItems || [
116
+ {
117
+ name: lang.hr_solid,
118
+ class: '__se__solid'
119
+ },
120
+ {
121
+ name: lang.hr_dashed,
122
+ class: '__se__dashed'
123
+ },
124
+ {
125
+ name: lang.hr_dotted,
126
+ class: '__se__dotted'
127
+ }
128
+ ];
129
+
130
+ let list = '';
131
+ for (let i = 0, len = items.length; i < len; i++) {
132
+ list += /*html*/ `
133
+ <li>
134
+ <button type="button" class="se-btn se-btn-list" data-command="hr" title="${items[i].name}" aria-label="${items[i].name}">
135
+ <hr${items[i].class ? ` class="${items[i].class}"` : ''}${items[i].style ? ` style="${items[i].style}"` : ''}/>
136
+ </button>
137
+ </li>`;
138
+ }
139
+
140
+ return dom.utils.createElement(
141
+ 'DIV',
142
+ {
143
+ class: 'se-dropdown se-list-layer se-list-line'
144
+ },
145
+ /*html*/ `
146
+ <div class="se-list-inner">
147
+ <ul class="se-list-basic">${list}</ul>
148
+ </div>`
149
+ );
150
+ }
151
+
152
+ export default HR;