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,304 +1,304 @@
1
- /**
2
- * @fileoverview Implements Helper for checking the node type and attributes.
3
- */
4
-
5
- import { onlyZeroWidthRegExp } from '../unicode';
6
- import domUtils from './domUtils';
7
-
8
- /**
9
- * @description A method that checks If the text is blank or to see if it contains 'ZERO WIDTH SPACE' or empty (unicode.zeroWidthSpace)
10
- * @param {string|Node} text String value or Node
11
- * @returns {boolean}
12
- */
13
- export function isZeroWidth(text) {
14
- if (text === null || text === undefined) return false;
15
- if (typeof text !== 'string') text = text.textContent;
16
- return text === '' || onlyZeroWidthRegExp.test(text);
17
- }
18
-
19
- /**
20
- * @description Determine if this offset is the edge offset of container
21
- * @param {Node} container The node of the selection object. (range.startContainer..)
22
- * @param {number} offset The offset of the selection object. (core.getRange().startOffset...)
23
- * @param {?"front"|"end"=} dir Select check point - Both edge, Front edge or End edge. ("front": Front edge, "end": End edge, undefined: Both edge)
24
- * @returns {boolean}
25
- */
26
- export function isEdgePoint(container, offset, dir) {
27
- return (dir !== 'end' && offset === 0) || ((!dir || dir !== 'front') && !container.nodeValue && offset === 1) || ((!dir || dir === 'end') && container.nodeValue && offset >= container.nodeValue.length);
28
- }
29
-
30
- /**
31
- * @description Check the node is a text node.
32
- * @param {?Node} node The node to check
33
- * @returns {node is Text}
34
- */
35
- export function isText(node) {
36
- return node?.nodeType === 3;
37
- }
38
-
39
- /**
40
- * @description Check the node is an HTMLElement node.
41
- * @param {?Node} node The node to check
42
- * @returns {node is HTMLElement}
43
- */
44
- export function isElement(node) {
45
- return node?.nodeType === 1;
46
- }
47
-
48
- /**
49
- * @description It is judged whether it is the input element (INPUT, TEXTAREA)
50
- * @param {?Node} node The node to check
51
- * @returns {node is HTMLInputElement}
52
- */
53
- export function isInputElement(node) {
54
- return isElement(node) && /^(INPUT|TEXTAREA|SELECT|OPTION)$/i.test(node.nodeName);
55
- }
56
-
57
- /**
58
- * @description It is judged whether it is the button element
59
- * @param {?Node} node The node to check
60
- * @returns {node is HTMLButtonElement}
61
- */
62
- export function isButtonElement(node) {
63
- return isElement(node) && /^(BUTTON)$/i.test(node.nodeName);
64
- }
65
-
66
- /**
67
- * @description Check the node is a list (ol, ul)
68
- * @param {?Node|string} node The element or element name to check
69
- * @returns {node is HTMLOListElement|HTMLUListElement}
70
- */
71
- export function isList(node) {
72
- return /^(OL|UL)$/i.test(typeof node === 'string' ? node : node?.nodeName);
73
- }
74
-
75
- /**
76
- * @description Check the node is a list cell (li)
77
- * @param {?Node|string} node The element or element name to check
78
- * @returns {node is HTMLLIElement}
79
- */
80
- export function isListCell(node) {
81
- return /^LI$/i.test(typeof node === 'string' ? node : node?.nodeName);
82
- }
83
-
84
- /**
85
- * @description Check the node is a table
86
- * @param {?Node|string} node The element or element name to check
87
- * @returns {node is HTMLTableElement}
88
- */
89
- export function isTable(node) {
90
- return /^TABLE$/i.test(typeof node === 'string' ? node : node?.nodeName);
91
- }
92
-
93
- /**
94
- * @description Check the node is a table elements. (table, thead, tbody, tr, th, td)
95
- * @param {?Node|string} node The element or element name to check
96
- * @returns {node is HTMLTableElement|HTMLTableSectionElement|HTMLTableRowElement|HTMLTableCellElement|HTMLTableColElement|HTMLTableColElement}
97
- */
98
- export function isTableElements(node) {
99
- return /^(TABLE|THEAD|TBODY|TR|TH|TD|COL)$/i.test(typeof node === 'string' ? node : node?.nodeName);
100
- }
101
-
102
- /**
103
- * @description Check the node is a table cell (td, th)
104
- * @param {?Node|string} node The element or element name to check
105
- * @returns {node is HTMLTableCellElement|HTMLTableColElement}
106
- */
107
- export function isTableCell(node) {
108
- return /^(TD|TH)$/i.test(typeof node === 'string' ? node : node?.nodeName);
109
- }
110
-
111
- /**
112
- * @description Check the node is a table row (tr)
113
- * @param {?Node|string} node The element or element name to check
114
- * @returns {node is HTMLTableRowElement}
115
- */
116
- export function isTableRow(node) {
117
- return /^TR$/i.test(typeof node === 'string' ? node : node?.nodeName);
118
- }
119
-
120
- /**
121
- * @description Check the node is a break node (BR)
122
- * @param {?Node|string} node The element or element name to check
123
- * @returns {node is HTMLBRElement}
124
- */
125
- export function isBreak(node) {
126
- return /^BR$/i.test(typeof node === 'string' ? node : node?.nodeName);
127
- }
128
-
129
- /**
130
- * @description Check the node is a anchor node (A)
131
- * @param {?Node|string} node The element or element name to check
132
- * @returns {node is HTMLAnchorElement}
133
- */
134
- export function isAnchor(node) {
135
- return /^A$/i.test(typeof node === 'string' ? node : node?.nodeName);
136
- }
137
-
138
- /**
139
- * @description Check the node is a media node (img, iframe, audio, video, canvas)
140
- * @param {?Node|string} node The element or element name to check
141
- * @returns {node is HTMLImageElement|HTMLIFrameElement|HTMLAudioElement|HTMLVideoElement|HTMLCanvasElement}
142
- */
143
- export function isMedia(node) {
144
- return /^(IMG|IFRAME|AUDIO|VIDEO|CANVAS)$/i.test(typeof node === 'string' ? node : node?.nodeName);
145
- }
146
-
147
- /**
148
- * @description Check the node is a iframe tag
149
- * @param {?Node|string} node The element or element name to check
150
- * @returns {node is HTMLIFrameElement}
151
- */
152
- export function isIFrame(node) {
153
- return /^IFRAME$/i.test(typeof node === 'string' ? node : node?.nodeName);
154
- }
155
-
156
- /**
157
- * @description Check the node is a figure tag
158
- * @param {?Node|string} node The element or element name to check
159
- * @returns {boolean}
160
- */
161
- export function isFigure(node) {
162
- return /^FIGURE$/i.test(typeof node === 'string' ? node : node?.nodeName);
163
- }
164
-
165
- /**
166
- * @description Checks whether the given node is a content-less (void) HTML tag
167
- * @param {?Node|string} node The element or element name to check
168
- * @returns {boolean}
169
- */
170
- export function isContentLess(node) {
171
- return /^(BR|COLGROUP|COL|THEAD|TBODY|TFOOT|TR|AREA|BASE|EMBED|HR|IMG|INPUT|KEYGEN|LINK|META|PARAM|SOURCE|TRACK|WBR)$/i.test(typeof node === 'string' ? node : node?.nodeName);
172
- }
173
-
174
- /**
175
- * @description Check the line element is empty.
176
- * @param {Node} node "line" element node
177
- * @returns {boolean}
178
- */
179
- export function isEmptyLine(node) {
180
- if (!node?.parentNode) return true;
181
- const el = /** @type {HTMLElement} */ (node);
182
- return !el.querySelector('IMG, IFRAME, AUDIO, VIDEO, CANVAS, TABLE') && el.children.length === 0 && check.isZeroWidth(el.textContent);
183
- }
184
-
185
- /**
186
- * @description It is judged whether it is the edit region top div element or iframe's body tag.
187
- * @param {?Node} node The node to check
188
- * @returns {node is HTMLElement}
189
- */
190
- export function isWysiwygFrame(node) {
191
- return node?.nodeType === 1 && (domUtils.hasClass(node, 'se-wrapper-wysiwyg|sun-editor-carrier-wrapper') || /^BODY$/i.test(node.nodeName));
192
- }
193
-
194
- /**
195
- * @description It is judged whether it is the contenteditable property is false.
196
- * @param {?Node} node The node to check
197
- * @returns {node is HTMLElement}
198
- */
199
- export function isNonEditable(node) {
200
- return node?.nodeType === 1 && /** @type {HTMLElement} */ (node).getAttribute('contenteditable') === 'false';
201
- }
202
-
203
- /**
204
- * @description Check the span's attributes are empty.
205
- * @param {?Node} node Element node
206
- * @returns {boolean}
207
- */
208
- export function isSpanWithoutAttr(node) {
209
- if (node?.nodeType !== 1) return false;
210
- const el = /** @type {HTMLElement} */ (node);
211
- return /^SPAN$/i.test(el.nodeName) && !el.className && !el.style.cssText;
212
- }
213
-
214
- /**
215
- * @description Compares the style and class for equal values.
216
- * @param {Node} a Node to compare
217
- * @param {Node} b Node to compare
218
- * @returns {boolean} Returns true if both are text nodes.
219
- */
220
- export function isSameAttributes(a, b) {
221
- if (a.nodeType === 3 && b.nodeType === 3) return true;
222
- if (a.nodeType === 3 || b.nodeType === 3) return false;
223
-
224
- const aEl = /** @type {HTMLElement} */ (a);
225
- const bEl = /** @type {HTMLElement} */ (b);
226
-
227
- const style_a = aEl.style;
228
- const style_b = bEl.style;
229
- let compStyle = 0;
230
-
231
- for (let i = 0, len = style_a.length; i < len; i++) {
232
- if (style_a[style_a[i]] === style_b[style_a[i]]) compStyle++;
233
- }
234
-
235
- const class_a = aEl.classList;
236
- const class_b = bEl.classList;
237
- const wRegExp = RegExp;
238
- let compClass = 0;
239
-
240
- for (let i = 0, len = class_a.length; i < len; i++) {
241
- if (wRegExp('(s|^)' + class_a[i] + '(s|$)').test(class_b.value)) compClass++;
242
- }
243
-
244
- return compStyle === style_b.length && compStyle === style_a.length && compClass === class_b.length && compClass === class_a.length;
245
- }
246
-
247
- /**
248
- * @description It is judged whether it is the not checking node. (class="katex", "MathJax", "se-exclude-format")
249
- * @param {Node} node The node to check
250
- * @returns {node is HTMLElement}
251
- */
252
- export function isExcludeFormat(node) {
253
- return /(\s|^)(katex|MathJax|se-exclude-format)(\s|$)/.test(/** @type {HTMLElement} */ (node)?.className);
254
- }
255
-
256
- /**
257
- * @description Checks for "__se__uneditable" in the class list.
258
- * - Components with class "__se__uneditable" cannot be modified.
259
- * @param {Node} node The element to check
260
- * @returns {boolean}
261
- */
262
- export function isUneditable(node) {
263
- return domUtils.hasClass(node, '__se__uneditable');
264
- }
265
-
266
- /**
267
- * @description Checks if element can't be easily enabled
268
- * @param {Node} node Element to check for
269
- * @returns {boolean}
270
- */
271
- export function isImportantDisabled(node) {
272
- return /** @type {HTMLElement} */ (node).hasAttribute('data-important-disabled');
273
- }
274
-
275
- const check = {
276
- isZeroWidth,
277
- isEdgePoint,
278
- isText,
279
- isElement,
280
- isInputElement,
281
- isButtonElement,
282
- isList,
283
- isListCell,
284
- isTable,
285
- isTableElements,
286
- isTableCell,
287
- isTableRow,
288
- isBreak,
289
- isAnchor,
290
- isMedia,
291
- isIFrame,
292
- isFigure,
293
- isContentLess,
294
- isEmptyLine,
295
- isWysiwygFrame,
296
- isNonEditable,
297
- isSpanWithoutAttr,
298
- isSameAttributes,
299
- isExcludeFormat,
300
- isUneditable,
301
- isImportantDisabled
302
- };
303
-
304
- export default check;
1
+ /**
2
+ * @fileoverview Implements Helper for checking the node type and attributes.
3
+ */
4
+
5
+ import { onlyZeroWidthRegExp } from '../unicode';
6
+ import domUtils from './domUtils';
7
+
8
+ /**
9
+ * @description A method that checks If the text is blank or to see if it contains 'ZERO WIDTH SPACE' or empty (unicode.zeroWidthSpace)
10
+ * @param {string|Node} text String value or Node
11
+ * @returns {boolean}
12
+ */
13
+ export function isZeroWidth(text) {
14
+ if (text === null || text === undefined) return false;
15
+ if (typeof text !== 'string') text = text.textContent;
16
+ return text === '' || onlyZeroWidthRegExp.test(text);
17
+ }
18
+
19
+ /**
20
+ * @description Determine if this offset is the edge offset of container
21
+ * @param {Node} container The node of the selection object. (range.startContainer..)
22
+ * @param {number} offset The offset of the selection object. (core.getRange().startOffset...)
23
+ * @param {?"front"|"end"=} dir Select check point - Both edge, Front edge or End edge. ("front": Front edge, "end": End edge, undefined: Both edge)
24
+ * @returns {boolean}
25
+ */
26
+ export function isEdgePoint(container, offset, dir) {
27
+ return (dir !== 'end' && offset === 0) || ((!dir || dir !== 'front') && !container.nodeValue && offset === 1) || ((!dir || dir === 'end') && container.nodeValue && offset >= container.nodeValue.length);
28
+ }
29
+
30
+ /**
31
+ * @description Check the node is a text node.
32
+ * @param {?Node} node The node to check
33
+ * @returns {node is Text}
34
+ */
35
+ export function isText(node) {
36
+ return node?.nodeType === 3;
37
+ }
38
+
39
+ /**
40
+ * @description Check the node is an HTMLElement node.
41
+ * @param {?Node} node The node to check
42
+ * @returns {node is HTMLElement}
43
+ */
44
+ export function isElement(node) {
45
+ return node?.nodeType === 1;
46
+ }
47
+
48
+ /**
49
+ * @description It is judged whether it is the input element (INPUT, TEXTAREA)
50
+ * @param {?Node} node The node to check
51
+ * @returns {node is HTMLInputElement}
52
+ */
53
+ export function isInputElement(node) {
54
+ return isElement(node) && /^(INPUT|TEXTAREA|SELECT|OPTION)$/i.test(node.nodeName);
55
+ }
56
+
57
+ /**
58
+ * @description It is judged whether it is the button element
59
+ * @param {?Node} node The node to check
60
+ * @returns {node is HTMLButtonElement}
61
+ */
62
+ export function isButtonElement(node) {
63
+ return isElement(node) && /^(BUTTON)$/i.test(node.nodeName);
64
+ }
65
+
66
+ /**
67
+ * @description Check the node is a list (ol, ul)
68
+ * @param {?Node|string} node The element or element name to check
69
+ * @returns {node is HTMLOListElement|HTMLUListElement}
70
+ */
71
+ export function isList(node) {
72
+ return /^(OL|UL)$/i.test(typeof node === 'string' ? node : node?.nodeName);
73
+ }
74
+
75
+ /**
76
+ * @description Check the node is a list cell (li)
77
+ * @param {?Node|string} node The element or element name to check
78
+ * @returns {node is HTMLLIElement}
79
+ */
80
+ export function isListCell(node) {
81
+ return /^LI$/i.test(typeof node === 'string' ? node : node?.nodeName);
82
+ }
83
+
84
+ /**
85
+ * @description Check the node is a table
86
+ * @param {?Node|string} node The element or element name to check
87
+ * @returns {node is HTMLTableElement}
88
+ */
89
+ export function isTable(node) {
90
+ return /^TABLE$/i.test(typeof node === 'string' ? node : node?.nodeName);
91
+ }
92
+
93
+ /**
94
+ * @description Check the node is a table elements. (table, thead, tbody, tr, th, td)
95
+ * @param {?Node|string} node The element or element name to check
96
+ * @returns {node is HTMLTableElement|HTMLTableSectionElement|HTMLTableRowElement|HTMLTableCellElement|HTMLTableColElement|HTMLTableColElement}
97
+ */
98
+ export function isTableElements(node) {
99
+ return /^(TABLE|THEAD|TBODY|TR|TH|TD|COL)$/i.test(typeof node === 'string' ? node : node?.nodeName);
100
+ }
101
+
102
+ /**
103
+ * @description Check the node is a table cell (td, th)
104
+ * @param {?Node|string} node The element or element name to check
105
+ * @returns {node is HTMLTableCellElement|HTMLTableColElement}
106
+ */
107
+ export function isTableCell(node) {
108
+ return /^(TD|TH)$/i.test(typeof node === 'string' ? node : node?.nodeName);
109
+ }
110
+
111
+ /**
112
+ * @description Check the node is a table row (tr)
113
+ * @param {?Node|string} node The element or element name to check
114
+ * @returns {node is HTMLTableRowElement}
115
+ */
116
+ export function isTableRow(node) {
117
+ return /^TR$/i.test(typeof node === 'string' ? node : node?.nodeName);
118
+ }
119
+
120
+ /**
121
+ * @description Check the node is a break node (BR)
122
+ * @param {?Node|string} node The element or element name to check
123
+ * @returns {node is HTMLBRElement}
124
+ */
125
+ export function isBreak(node) {
126
+ return /^BR$/i.test(typeof node === 'string' ? node : node?.nodeName);
127
+ }
128
+
129
+ /**
130
+ * @description Check the node is a anchor node (A)
131
+ * @param {?Node|string} node The element or element name to check
132
+ * @returns {node is HTMLAnchorElement}
133
+ */
134
+ export function isAnchor(node) {
135
+ return /^A$/i.test(typeof node === 'string' ? node : node?.nodeName);
136
+ }
137
+
138
+ /**
139
+ * @description Check the node is a media node (img, iframe, audio, video, canvas)
140
+ * @param {?Node|string} node The element or element name to check
141
+ * @returns {node is HTMLImageElement|HTMLIFrameElement|HTMLAudioElement|HTMLVideoElement|HTMLCanvasElement}
142
+ */
143
+ export function isMedia(node) {
144
+ return /^(IMG|IFRAME|AUDIO|VIDEO|CANVAS)$/i.test(typeof node === 'string' ? node : node?.nodeName);
145
+ }
146
+
147
+ /**
148
+ * @description Check the node is a iframe tag
149
+ * @param {?Node|string} node The element or element name to check
150
+ * @returns {node is HTMLIFrameElement}
151
+ */
152
+ export function isIFrame(node) {
153
+ return /^IFRAME$/i.test(typeof node === 'string' ? node : node?.nodeName);
154
+ }
155
+
156
+ /**
157
+ * @description Check the node is a figure tag
158
+ * @param {?Node|string} node The element or element name to check
159
+ * @returns {boolean}
160
+ */
161
+ export function isFigure(node) {
162
+ return /^FIGURE$/i.test(typeof node === 'string' ? node : node?.nodeName);
163
+ }
164
+
165
+ /**
166
+ * @description Checks whether the given node is a content-less (void) HTML tag
167
+ * @param {?Node|string} node The element or element name to check
168
+ * @returns {boolean}
169
+ */
170
+ export function isContentLess(node) {
171
+ return /^(BR|COLGROUP|COL|THEAD|TBODY|TFOOT|TR|AREA|BASE|EMBED|HR|IMG|INPUT|KEYGEN|LINK|META|PARAM|SOURCE|TRACK|WBR)$/i.test(typeof node === 'string' ? node : node?.nodeName);
172
+ }
173
+
174
+ /**
175
+ * @description Check the line element is empty.
176
+ * @param {Node} node "line" element node
177
+ * @returns {boolean}
178
+ */
179
+ export function isEmptyLine(node) {
180
+ if (!node?.parentNode) return true;
181
+ const el = /** @type {HTMLElement} */ (node);
182
+ return !el.querySelector('IMG, IFRAME, AUDIO, VIDEO, CANVAS, TABLE') && (el.children.length <= 1 || isBreak(el.firstElementChild)) && isZeroWidth(el.textContent);
183
+ }
184
+
185
+ /**
186
+ * @description It is judged whether it is the edit region top div element or iframe's body tag.
187
+ * @param {?Node} node The node to check
188
+ * @returns {node is HTMLElement}
189
+ */
190
+ export function isWysiwygFrame(node) {
191
+ return node?.nodeType === 1 && (domUtils.hasClass(node, 'se-wrapper-wysiwyg|sun-editor-carrier-wrapper|se-wrapper') || /^BODY$/i.test(node.nodeName));
192
+ }
193
+
194
+ /**
195
+ * @description It is judged whether it is the contenteditable property is false.
196
+ * @param {?Node} node The node to check
197
+ * @returns {node is HTMLElement}
198
+ */
199
+ export function isNonEditable(node) {
200
+ return node?.nodeType === 1 && /** @type {HTMLElement} */ (node).getAttribute('contenteditable') === 'false';
201
+ }
202
+
203
+ /**
204
+ * @description Check the span's attributes are empty.
205
+ * @param {?Node} node Element node
206
+ * @returns {boolean}
207
+ */
208
+ export function isSpanWithoutAttr(node) {
209
+ if (node?.nodeType !== 1) return false;
210
+ const el = /** @type {HTMLElement} */ (node);
211
+ return /^SPAN$/i.test(el.nodeName) && !el.className && !el.style.cssText;
212
+ }
213
+
214
+ /**
215
+ * @description Compares the style and class for equal values.
216
+ * @param {Node} a Node to compare
217
+ * @param {Node} b Node to compare
218
+ * @returns {boolean} Returns true if both are text nodes.
219
+ */
220
+ export function isSameAttributes(a, b) {
221
+ if (a.nodeType === 3 && b.nodeType === 3) return true;
222
+ if (a.nodeType === 3 || b.nodeType === 3) return false;
223
+
224
+ const aEl = /** @type {HTMLElement} */ (a);
225
+ const bEl = /** @type {HTMLElement} */ (b);
226
+
227
+ const style_a = aEl.style;
228
+ const style_b = bEl.style;
229
+ let compStyle = 0;
230
+
231
+ for (let i = 0, len = style_a.length; i < len; i++) {
232
+ if (style_a[style_a[i]] === style_b[style_a[i]]) compStyle++;
233
+ }
234
+
235
+ const class_a = aEl.classList;
236
+ const class_b = bEl.classList;
237
+ const wRegExp = RegExp;
238
+ let compClass = 0;
239
+
240
+ for (let i = 0, len = class_a.length; i < len; i++) {
241
+ if (wRegExp('(s|^)' + class_a[i] + '(s|$)').test(class_b.value)) compClass++;
242
+ }
243
+
244
+ return compStyle === style_b.length && compStyle === style_a.length && compClass === class_b.length && compClass === class_a.length;
245
+ }
246
+
247
+ /**
248
+ * @description It is judged whether it is the not checking node. (class="katex", "MathJax", "se-exclude-format")
249
+ * @param {Node} node The node to check
250
+ * @returns {node is HTMLElement}
251
+ */
252
+ export function isExcludeFormat(node) {
253
+ return /(\s|^)(katex|MathJax|se-exclude-format)(\s|$)/.test(/** @type {HTMLElement} */ (node)?.className);
254
+ }
255
+
256
+ /**
257
+ * @description Checks for "__se__uneditable" in the class list.
258
+ * - Components with class "__se__uneditable" cannot be modified.
259
+ * @param {Node} node The element to check
260
+ * @returns {boolean}
261
+ */
262
+ export function isUneditable(node) {
263
+ return domUtils.hasClass(node, '__se__uneditable');
264
+ }
265
+
266
+ /**
267
+ * @description Checks if element can't be easily enabled
268
+ * @param {Node} node Element to check for
269
+ * @returns {boolean}
270
+ */
271
+ export function isImportantDisabled(node) {
272
+ return /** @type {HTMLElement} */ (node).hasAttribute('data-important-disabled');
273
+ }
274
+
275
+ const check = {
276
+ isZeroWidth,
277
+ isEdgePoint,
278
+ isText,
279
+ isElement,
280
+ isInputElement,
281
+ isButtonElement,
282
+ isList,
283
+ isListCell,
284
+ isTable,
285
+ isTableElements,
286
+ isTableCell,
287
+ isTableRow,
288
+ isBreak,
289
+ isAnchor,
290
+ isMedia,
291
+ isIFrame,
292
+ isFigure,
293
+ isContentLess,
294
+ isEmptyLine,
295
+ isWysiwygFrame,
296
+ isNonEditable,
297
+ isSpanWithoutAttr,
298
+ isSameAttributes,
299
+ isExcludeFormat,
300
+ isUneditable,
301
+ isImportantDisabled
302
+ };
303
+
304
+ export default check;