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.
- package/CONTRIBUTING.md +186 -184
- package/LICENSE +21 -21
- package/README.md +157 -180
- package/dist/suneditor.min.css +1 -1
- package/dist/suneditor.min.js +1 -1
- package/package.json +126 -123
- package/src/assets/design/color.css +131 -121
- package/src/assets/design/index.css +3 -3
- package/src/assets/design/size.css +37 -35
- package/src/assets/design/typography.css +37 -37
- package/src/assets/icons/defaultIcons.js +247 -232
- package/src/assets/suneditor-contents.css +779 -778
- package/src/assets/suneditor.css +43 -35
- package/src/core/base/eventHandlers/handler_toolbar.js +135 -135
- package/src/core/base/eventHandlers/handler_ww_clipboard.js +56 -56
- package/src/core/base/eventHandlers/handler_ww_dragDrop.js +115 -113
- package/src/core/base/eventHandlers/handler_ww_key_input.js +1200 -1200
- package/src/core/base/eventHandlers/handler_ww_mouse.js +194 -194
- package/src/core/base/eventManager.js +1550 -1484
- package/src/core/base/history.js +355 -355
- package/src/core/class/char.js +163 -162
- package/src/core/class/component.js +856 -842
- package/src/core/class/format.js +3433 -3422
- package/src/core/class/html.js +1927 -1890
- package/src/core/class/menu.js +357 -346
- package/src/core/class/nodeTransform.js +424 -424
- package/src/core/class/offset.js +858 -891
- package/src/core/class/selection.js +710 -620
- package/src/core/class/shortcuts.js +98 -98
- package/src/core/class/toolbar.js +438 -430
- package/src/core/class/ui.js +424 -422
- package/src/core/class/viewer.js +750 -750
- package/src/core/editor.js +1810 -1708
- package/src/core/section/actives.js +268 -241
- package/src/core/section/constructor.js +1348 -1661
- package/src/core/section/context.js +102 -102
- package/src/core/section/documentType.js +582 -561
- package/src/core/section/options.js +367 -0
- package/src/core/util/instanceCheck.js +59 -0
- package/src/editorInjector/_classes.js +36 -36
- package/src/editorInjector/_core.js +92 -92
- package/src/editorInjector/index.js +75 -75
- package/src/events.js +634 -622
- package/src/helper/clipboard.js +59 -59
- package/src/helper/converter.js +586 -564
- package/src/helper/dom/domCheck.js +304 -304
- package/src/helper/dom/domQuery.js +677 -669
- package/src/helper/dom/domUtils.js +618 -557
- package/src/helper/dom/index.js +12 -12
- package/src/helper/env.js +249 -240
- package/src/helper/index.js +25 -25
- package/src/helper/keyCodeMap.js +183 -183
- package/src/helper/numbers.js +72 -72
- package/src/helper/unicode.js +47 -47
- package/src/langs/ckb.js +231 -231
- package/src/langs/cs.js +231 -231
- package/src/langs/da.js +231 -231
- package/src/langs/de.js +231 -231
- package/src/langs/en.js +230 -230
- package/src/langs/es.js +231 -231
- package/src/langs/fa.js +231 -231
- package/src/langs/fr.js +231 -231
- package/src/langs/he.js +231 -231
- package/src/langs/hu.js +230 -230
- package/src/langs/index.js +28 -28
- package/src/langs/it.js +231 -231
- package/src/langs/ja.js +230 -230
- package/src/langs/km.js +230 -230
- package/src/langs/ko.js +230 -230
- package/src/langs/lv.js +231 -231
- package/src/langs/nl.js +231 -231
- package/src/langs/pl.js +231 -231
- package/src/langs/pt_br.js +231 -231
- package/src/langs/ro.js +231 -231
- package/src/langs/ru.js +231 -231
- package/src/langs/se.js +231 -231
- package/src/langs/tr.js +231 -231
- package/src/langs/uk.js +231 -231
- package/src/langs/ur.js +231 -231
- package/src/langs/zh_cn.js +231 -231
- package/src/modules/ApiManager.js +191 -191
- package/src/modules/Browser.js +669 -667
- package/src/modules/ColorPicker.js +364 -362
- package/src/modules/Controller.js +474 -454
- package/src/modules/Figure.js +1620 -1617
- package/src/modules/FileManager.js +359 -359
- package/src/modules/HueSlider.js +577 -565
- package/src/modules/Modal.js +346 -346
- package/src/modules/ModalAnchorEditor.js +643 -643
- package/src/modules/SelectMenu.js +549 -549
- package/src/modules/_DragHandle.js +17 -17
- package/src/modules/index.js +14 -14
- package/src/plugins/browser/audioGallery.js +83 -83
- package/src/plugins/browser/fileBrowser.js +103 -103
- package/src/plugins/browser/fileGallery.js +83 -83
- package/src/plugins/browser/imageGallery.js +81 -81
- package/src/plugins/browser/videoGallery.js +103 -103
- package/src/plugins/command/blockquote.js +61 -60
- package/src/plugins/command/exportPDF.js +134 -134
- package/src/plugins/command/fileUpload.js +456 -456
- package/src/plugins/command/list_bulleted.js +149 -148
- package/src/plugins/command/list_numbered.js +152 -151
- package/src/plugins/dropdown/align.js +157 -155
- package/src/plugins/dropdown/backgroundColor.js +108 -104
- package/src/plugins/dropdown/font.js +141 -137
- package/src/plugins/dropdown/fontColor.js +109 -105
- package/src/plugins/dropdown/formatBlock.js +170 -178
- package/src/plugins/dropdown/hr.js +152 -152
- package/src/plugins/dropdown/layout.js +83 -83
- package/src/plugins/dropdown/lineHeight.js +131 -130
- package/src/plugins/dropdown/list.js +123 -122
- package/src/plugins/dropdown/paragraphStyle.js +138 -138
- package/src/plugins/dropdown/table.js +4110 -4000
- package/src/plugins/dropdown/template.js +83 -83
- package/src/plugins/dropdown/textStyle.js +149 -149
- package/src/plugins/field/mention.js +242 -242
- package/src/plugins/index.js +120 -120
- package/src/plugins/input/fontSize.js +414 -410
- package/src/plugins/input/pageNavigator.js +71 -70
- package/src/plugins/modal/audio.js +677 -677
- package/src/plugins/modal/drawing.js +537 -531
- package/src/plugins/modal/embed.js +886 -886
- package/src/plugins/modal/image.js +1377 -1376
- package/src/plugins/modal/link.js +248 -240
- package/src/plugins/modal/math.js +563 -563
- package/src/plugins/modal/video.js +1226 -1226
- package/src/plugins/popup/anchor.js +224 -222
- package/src/suneditor.js +114 -107
- package/src/themes/dark.css +132 -122
- package/src/typedef.js +132 -130
- package/types/assets/icons/defaultIcons.d.ts +8 -0
- package/types/core/base/eventManager.d.ts +29 -4
- package/types/core/class/char.d.ts +2 -1
- package/types/core/class/component.d.ts +1 -2
- package/types/core/class/format.d.ts +8 -1
- package/types/core/class/html.d.ts +8 -0
- package/types/core/class/menu.d.ts +8 -0
- package/types/core/class/offset.d.ts +24 -26
- package/types/core/class/selection.d.ts +2 -0
- package/types/core/class/toolbar.d.ts +6 -0
- package/types/core/class/ui.d.ts +1 -1
- package/types/core/editor.d.ts +34 -12
- package/types/core/section/constructor.d.ts +5 -638
- package/types/core/section/documentType.d.ts +12 -2
- package/types/core/section/options.d.ts +740 -0
- package/types/core/util/instanceCheck.d.ts +50 -0
- package/types/editorInjector/_core.d.ts +5 -5
- package/types/editorInjector/index.d.ts +2 -2
- package/types/events.d.ts +2 -0
- package/types/helper/converter.d.ts +9 -0
- package/types/helper/dom/domQuery.d.ts +5 -5
- package/types/helper/dom/domUtils.d.ts +8 -0
- package/types/helper/env.d.ts +6 -1
- package/types/helper/index.d.ts +4 -1
- package/types/index.d.ts +122 -120
- package/types/langs/_Lang.d.ts +194 -194
- package/types/modules/ColorPicker.d.ts +5 -1
- package/types/modules/Controller.d.ts +8 -4
- package/types/modules/Figure.d.ts +2 -1
- package/types/modules/HueSlider.d.ts +4 -1
- package/types/modules/SelectMenu.d.ts +1 -1
- package/types/plugins/command/blockquote.d.ts +1 -0
- package/types/plugins/command/list_bulleted.d.ts +1 -0
- package/types/plugins/command/list_numbered.d.ts +1 -0
- package/types/plugins/dropdown/align.d.ts +1 -0
- package/types/plugins/dropdown/backgroundColor.d.ts +1 -0
- package/types/plugins/dropdown/font.d.ts +1 -0
- package/types/plugins/dropdown/fontColor.d.ts +1 -0
- package/types/plugins/dropdown/formatBlock.d.ts +3 -2
- package/types/plugins/dropdown/lineHeight.d.ts +1 -0
- package/types/plugins/dropdown/list.d.ts +1 -0
- package/types/plugins/dropdown/table.d.ts +6 -0
- package/types/plugins/input/fontSize.d.ts +1 -0
- package/types/plugins/modal/drawing.d.ts +4 -0
- package/types/plugins/modal/link.d.ts +32 -15
- package/types/suneditor.d.ts +13 -9
- 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
|
|
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;
|