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,12 +1,12 @@
1
- // index.js
2
- import query from './domQuery';
3
- import check from './domCheck';
4
- import utils from './domUtils';
5
-
6
- const dom = {
7
- query,
8
- check,
9
- utils
10
- };
11
-
12
- export default dom;
1
+ // index.js
2
+ import query from './domQuery';
3
+ import check from './domCheck';
4
+ import utils from './domUtils';
5
+
6
+ const dom = {
7
+ query,
8
+ check,
9
+ utils
10
+ };
11
+
12
+ export default dom;
package/src/helper/env.js CHANGED
@@ -1,240 +1,249 @@
1
- /**
2
- * @fileoverview Environment helper functions
3
- */
4
-
5
- /** @type {Window} */
6
- export const _w = window;
7
- /** @type {Document} */
8
- export const _d = document;
9
-
10
- /**
11
- * @description No event symbol
12
- * @type {Symbol}
13
- */
14
- export const NO_EVENT = Symbol('noEventHandler');
15
-
16
- /**
17
- * @description On over component symbol
18
- * @type {Symbol}
19
- */
20
- export const ON_OVER_COMPONENT = Symbol('onOverComponent');
21
-
22
- const userAgent = navigator.userAgent.toLowerCase();
23
-
24
- /**
25
- * @description Gets XMLHttpRequest object
26
- * @returns {XMLHttpRequest}
27
- */
28
- export function getXMLHttpRequest() {
29
- return new XMLHttpRequest();
30
- }
31
-
32
- /**
33
- * @deprecated
34
- * @description Returns the CSS text that has been applied to the current page.
35
- * @param {Document|null} doc To get the CSS text of an document. If null get the current document.
36
- * @returns {string} Styles string
37
- */
38
- export function getPageStyle(doc) {
39
- let cssText = '';
40
- const sheets = (doc || _d).styleSheets;
41
-
42
- for (let i = 0, len = sheets.length, rules; i < len; i++) {
43
- /* eslint-disable @typescript-eslint/no-unused-vars */
44
- try {
45
- rules = sheets[i].cssRules;
46
- } catch (e) {
47
- continue;
48
- }
49
- /* eslint-disable @typescript-eslint/no-unused-vars */
50
-
51
- if (rules) {
52
- for (let c = 0, cLen = rules.length; c < cLen; c++) {
53
- cssText += rules[c].cssText;
54
- }
55
- }
56
- }
57
-
58
- return cssText;
59
- }
60
-
61
- /**
62
- * @deprecated
63
- * @description Get the the tag path of the arguments value
64
- * @param {Array<string>} nameArray File name array
65
- * @param {string} extension js, css
66
- * @returns {string} If not found, return the first found value
67
- */
68
- export function getIncludePath(nameArray, extension) {
69
- let path = '';
70
- const pathList = [];
71
- const tagName = extension === 'js' ? 'script' : 'link';
72
- const src = extension === 'js' ? 'src' : 'href';
73
-
74
- let fileName = '(?:';
75
- for (let i = 0, len = nameArray.length; i < len; i++) {
76
- fileName += nameArray[i] + (i < len - 1 ? '|' : ')');
77
- }
78
-
79
- const regExp = new RegExp(`(^|.*[\\/])${fileName}(\\.[^\\/]+)?.${extension}(?:\\?.*|;.*)?$`, 'i');
80
- const extRegExp = new RegExp(`.+\\.${extension}(?:\\?.*|;.*)?$`, 'i');
81
-
82
- for (let c = _d.getElementsByTagName(tagName), i = 0; i < c.length; i++) {
83
- if (extRegExp.test(c[i][src])) {
84
- pathList.push(c[i]);
85
- }
86
- }
87
-
88
- for (let i = 0; i < pathList.length; i++) {
89
- const editorTag = pathList[i][src].match(regExp);
90
- if (editorTag) {
91
- path = editorTag[0];
92
- break;
93
- }
94
- }
95
-
96
- if (path === '') path = pathList.length > 0 ? pathList[0][src] : '';
97
-
98
- if (!path.includes(':/') && '//' !== path.slice(0, 2)) {
99
- path = false === path.includes('/') ? location.href.match(/^.*?:\/\/[^/]*/)[0] + path : location.href.match(/^[^?]*\/(?:)/)[0] + path;
100
- }
101
-
102
- if (!path) {
103
- throw '[SUNEDITOR.helper.env.getIncludePath.fail] The SUNEDITOR installation path could not be automatically detected. (path: +' + path + ', extension: ' + extension + ')';
104
- }
105
-
106
- return path;
107
- }
108
-
109
- /** --- Check browser --- */
110
- /**
111
- * @description Check if support ResizeObserver function
112
- * @returns {boolean} Whether support ResizeObserver function or not.
113
- */
114
- export const isResizeObserverSupported = (() => {
115
- return typeof ResizeObserver === 'function';
116
- })();
117
-
118
- /**
119
- * @description Check if support navigator.clipboard
120
- * @returns {boolean} Whether support navigator.clipboard or not.
121
- */
122
- export const isClipboardSupported = (() => {
123
- /* eslint-disable-next-line compat/compat */
124
- return typeof navigator.clipboard?.write === 'function';
125
- })();
126
-
127
- /**
128
- * @description Check if User Agent is Edge
129
- * @returns {boolean} Whether User Agent is Edge or not.
130
- */
131
- export const isEdge = (() => {
132
- return /Edg/.test(navigator.userAgent);
133
- })();
134
-
135
- /**
136
- * @description Check if User Agent is OSX or IOS
137
- * @type {boolean}
138
- */
139
- export const isOSX_IOS = (() => {
140
- return /(Mac|iPhone|iPod|iPad)/.test(navigator.userAgent);
141
- })();
142
-
143
- /**
144
- * @description Check if User Agent Blink engine.
145
- * @type {boolean}
146
- */
147
- export const isBlink = (() => {
148
- return userAgent.includes('chrome/') && !userAgent.includes('edge/');
149
- })();
150
-
151
- /**
152
- * @description Check if User Agent is Firefox (Gecko).
153
- * @type {boolean}
154
- */
155
- export const isGecko = (() => {
156
- return !!userAgent.match(/gecko\/\d+/);
157
- })();
158
-
159
- /**
160
- * @description Check if User Agent is Chromium browser.
161
- * @type {boolean}
162
- */
163
- export const isChromium = (() => {
164
- return !!(/** @type {Window & { chrome: any }} */ (_w).chrome);
165
- })();
166
-
167
- /**
168
- * @description Check if User Agent is Safari.
169
- * @type {boolean}
170
- */
171
- export const isSafari = (() => {
172
- return userAgent.includes('applewebkit/') && !userAgent.includes('chrome');
173
- })();
174
-
175
- /**
176
- * @description Check if User Agent is Mobile device.
177
- * - when the device is touchable, it is judged as a mobile device.
178
- * @type {boolean}
179
- */
180
- export const isMobile = (() => {
181
- /* eslint-disable-next-line compat/compat */
182
- return /Android|webOS|iPhone|iPad|iPod|BlackBerry|IEMobile|Opera Mini/i.test(userAgent) || (navigator.maxTouchPoints > 0 && 'ontouchstart' in _w);
183
- })();
184
-
185
- /**
186
- * @description Check if User Agent is Android mobile device.
187
- * @type {boolean}
188
- */
189
- export const isAndroid = (() => {
190
- return userAgent.includes('android');
191
- })();
192
-
193
- /**
194
- * @description Command(Mac) or CTRL(Window) icon.
195
- * @type {string}
196
- */
197
- export const cmdIcon = isOSX_IOS ? '⌘' : 'CTRL';
198
-
199
- /**
200
- * @description SHIFT(Mac, Window) icon.
201
- * @type {string}
202
- */
203
- export const shiftIcon = isOSX_IOS ? '⇧' : '+SHIFT';
204
-
205
- /**
206
- * @description Device pixel ratio
207
- * @type {number}
208
- */
209
- export const DPI = _w.devicePixelRatio;
210
-
211
- /** --- editor env --- */
212
- export const KATEX_WEBSITE = 'https://katex.org/docs/supported.html';
213
- export const MATHJAX_WEBSITE = 'https://www.mathjax.org/';
214
-
215
- const env = {
216
- _w,
217
- _d,
218
- NO_EVENT,
219
- ON_OVER_COMPONENT,
220
- getXMLHttpRequest,
221
- getPageStyle,
222
- getIncludePath,
223
- isResizeObserverSupported,
224
- isClipboardSupported,
225
- isEdge,
226
- isBlink,
227
- isGecko,
228
- isChromium,
229
- isSafari,
230
- isOSX_IOS,
231
- isAndroid,
232
- isMobile,
233
- cmdIcon,
234
- shiftIcon,
235
- DPI,
236
- KATEX_WEBSITE,
237
- MATHJAX_WEBSITE
238
- };
239
-
240
- export default env;
1
+ /**
2
+ * @fileoverview Environment helper functions
3
+ */
4
+
5
+ /** @type {Window} */
6
+ export const _w = window;
7
+ /** @type {Document} */
8
+ export const _d = document;
9
+
10
+ /**
11
+ * @description No event symbol
12
+ * @type {Symbol}
13
+ */
14
+ export const NO_EVENT = Symbol('noEventHandler');
15
+
16
+ /**
17
+ * @description On over component symbol
18
+ * @type {Symbol}
19
+ */
20
+ export const ON_OVER_COMPONENT = Symbol('onOverComponent');
21
+
22
+ const userAgent = navigator.userAgent.toLowerCase();
23
+
24
+ /**
25
+ * @description Gets XMLHttpRequest object
26
+ * @returns {XMLHttpRequest}
27
+ */
28
+ export function getXMLHttpRequest() {
29
+ return new XMLHttpRequest();
30
+ }
31
+
32
+ /**
33
+ * @deprecated
34
+ * @description Returns the CSS text that has been applied to the current page.
35
+ * @param {Document|null} doc To get the CSS text of an document. If null get the current document.
36
+ * @returns {string} Styles string
37
+ */
38
+ export function getPageStyle(doc) {
39
+ let cssText = '';
40
+ const sheets = (doc || _d).styleSheets;
41
+
42
+ for (let i = 0, len = sheets.length, rules; i < len; i++) {
43
+ /* eslint-disable @typescript-eslint/no-unused-vars */
44
+ try {
45
+ rules = sheets[i].cssRules;
46
+ } catch (e) {
47
+ continue;
48
+ }
49
+ /* eslint-disable @typescript-eslint/no-unused-vars */
50
+
51
+ if (rules) {
52
+ for (let c = 0, cLen = rules.length; c < cLen; c++) {
53
+ cssText += rules[c].cssText;
54
+ }
55
+ }
56
+ }
57
+
58
+ return cssText;
59
+ }
60
+
61
+ /**
62
+ * @deprecated
63
+ * @description Get the the tag path of the arguments value
64
+ * @param {Array<string>} nameArray File name array
65
+ * @param {string} extension js, css
66
+ * @returns {string} If not found, return the first found value
67
+ */
68
+ export function getIncludePath(nameArray, extension) {
69
+ let path = '';
70
+ const pathList = [];
71
+ const tagName = extension === 'js' ? 'script' : 'link';
72
+ const src = extension === 'js' ? 'src' : 'href';
73
+
74
+ let fileName = '(?:';
75
+ for (let i = 0, len = nameArray.length; i < len; i++) {
76
+ fileName += nameArray[i] + (i < len - 1 ? '|' : ')');
77
+ }
78
+
79
+ const regExp = new RegExp(`(^|.*[\\/])${fileName}(\\.[^\\/]+)?.${extension}(?:\\?.*|;.*)?$`, 'i');
80
+ const extRegExp = new RegExp(`.+\\.${extension}(?:\\?.*|;.*)?$`, 'i');
81
+
82
+ for (let c = _d.getElementsByTagName(tagName), i = 0; i < c.length; i++) {
83
+ if (extRegExp.test(c[i][src])) {
84
+ pathList.push(c[i]);
85
+ }
86
+ }
87
+
88
+ for (let i = 0; i < pathList.length; i++) {
89
+ const editorTag = pathList[i][src].match(regExp);
90
+ if (editorTag) {
91
+ path = editorTag[0];
92
+ break;
93
+ }
94
+ }
95
+
96
+ if (path === '') path = pathList.length > 0 ? pathList[0][src] : '';
97
+
98
+ if (!path.includes(':/') && '//' !== path.slice(0, 2)) {
99
+ path = false === path.includes('/') ? location.href.match(/^.*?:\/\/[^/]*/)[0] + path : location.href.match(/^[^?]*\/(?:)/)[0] + path;
100
+ }
101
+
102
+ if (!path) {
103
+ throw '[SUNEDITOR.helper.env.getIncludePath.fail] The SUNEDITOR installation path could not be automatically detected. (path: +' + path + ', extension: ' + extension + ')';
104
+ }
105
+
106
+ return path;
107
+ }
108
+
109
+ /** --- Check browser --- */
110
+ /**
111
+ * @description Check if support ResizeObserver function
112
+ * @returns {boolean} Whether support ResizeObserver function or not.
113
+ */
114
+ export const isResizeObserverSupported = (() => {
115
+ return typeof ResizeObserver === 'function';
116
+ })();
117
+
118
+ /**
119
+ * @description Check if support navigator.clipboard
120
+ * @returns {boolean} Whether support navigator.clipboard or not.
121
+ */
122
+ export const isClipboardSupported = (() => {
123
+ /* eslint-disable-next-line compat/compat */
124
+ return typeof navigator.clipboard?.write === 'function';
125
+ })();
126
+
127
+ /**
128
+ * @description Check if User Agent is Edge
129
+ * @returns {boolean} Whether User Agent is Edge or not.
130
+ */
131
+ export const isEdge = (() => {
132
+ return /Edg/.test(navigator.userAgent);
133
+ })();
134
+
135
+ /**
136
+ * @description Check if User Agent is OSX or IOS
137
+ * @type {boolean}
138
+ */
139
+ export const isOSX_IOS = (() => {
140
+ return /(Mac|iPhone|iPod|iPad)/.test(navigator.userAgent);
141
+ })();
142
+
143
+ /**
144
+ * @description Check if User Agent Blink engine.
145
+ * @type {boolean}
146
+ */
147
+ export const isBlink = (() => {
148
+ return userAgent.includes('chrome/') && !userAgent.includes('edge/');
149
+ })();
150
+
151
+ /**
152
+ * @description Check if User Agent is Firefox (Gecko).
153
+ * @type {boolean}
154
+ */
155
+ export const isGecko = (() => {
156
+ return !!userAgent.match(/gecko\/\d+/);
157
+ })();
158
+
159
+ /**
160
+ * @description Check if User Agent is Chromium browser.
161
+ * @type {boolean}
162
+ */
163
+ export const isChromium = (() => {
164
+ return !!(/** @type {Window & { chrome: any }} */ (_w).chrome);
165
+ })();
166
+
167
+ /**
168
+ * @description Check if User Agent is Safari.
169
+ * @type {boolean}
170
+ */
171
+ export const isSafari = (() => {
172
+ return userAgent.includes('applewebkit/') && !userAgent.includes('chrome');
173
+ })();
174
+
175
+ /**
176
+ * @description Check if User Agent is Mobile device.
177
+ * @type {boolean}
178
+ */
179
+ export const isMobile = (() => {
180
+ /* eslint-disable-next-line compat/compat */
181
+ return /Android|webOS|iPhone|iPad|iPod|BlackBerry|IEMobile|Opera Mini/i.test(userAgent);
182
+ })();
183
+
184
+ /**
185
+ * @description Check if the device is touchable.
186
+ * @type {boolean}
187
+ */
188
+ export const isTouchDevice = (() => {
189
+ /* eslint-disable-next-line compat/compat */
190
+ return navigator.maxTouchPoints > 0 && 'ontouchstart' in _w;
191
+ })();
192
+
193
+ /**
194
+ * @description Check if User Agent is Android mobile device.
195
+ * @type {boolean}
196
+ */
197
+ export const isAndroid = (() => {
198
+ return userAgent.includes('android');
199
+ })();
200
+
201
+ /**
202
+ * @description Command(Mac) or CTRL(Window) icon.
203
+ * @type {string}
204
+ */
205
+ export const cmdIcon = isOSX_IOS ? '⌘' : 'CTRL';
206
+
207
+ /**
208
+ * @description SHIFT(Mac, Window) icon.
209
+ * @type {string}
210
+ */
211
+ export const shiftIcon = isOSX_IOS ? '⇧' : '+SHIFT';
212
+
213
+ /**
214
+ * @description Device pixel ratio
215
+ * @type {number}
216
+ */
217
+ export const DPI = _w.devicePixelRatio;
218
+
219
+ /** --- editor env --- */
220
+ export const KATEX_WEBSITE = 'https://katex.org/docs/supported.html';
221
+ export const MATHJAX_WEBSITE = 'https://www.mathjax.org/';
222
+
223
+ const env = {
224
+ _w,
225
+ _d,
226
+ NO_EVENT,
227
+ ON_OVER_COMPONENT,
228
+ getXMLHttpRequest,
229
+ getPageStyle,
230
+ getIncludePath,
231
+ isResizeObserverSupported,
232
+ isClipboardSupported,
233
+ isEdge,
234
+ isBlink,
235
+ isGecko,
236
+ isChromium,
237
+ isSafari,
238
+ isOSX_IOS,
239
+ isAndroid,
240
+ isMobile,
241
+ isTouchDevice,
242
+ cmdIcon,
243
+ shiftIcon,
244
+ DPI,
245
+ KATEX_WEBSITE,
246
+ MATHJAX_WEBSITE
247
+ };
248
+
249
+ export default env;
@@ -1,25 +1,25 @@
1
- import Env from './env';
2
- import Unicode from './unicode';
3
- import Converter from './converter';
4
- import Dom from './dom';
5
- import Numbers from './numbers';
6
- import KeyCodeMap from './keyCodeMap';
7
- import Clipboard from './clipboard';
8
-
9
- export const env = Env;
10
- export const unicode = Unicode;
11
- export const converter = Converter;
12
- export const dom = Dom;
13
- export const numbers = Numbers;
14
- export const keyCodeMap = KeyCodeMap;
15
- export const clipboard = Clipboard;
16
-
17
- export default {
18
- env,
19
- unicode,
20
- converter,
21
- dom,
22
- numbers,
23
- keyCodeMap,
24
- clipboard
25
- };
1
+ import Env from './env';
2
+ import Unicode from './unicode';
3
+ import Converter from './converter';
4
+ import Dom from './dom';
5
+ import Numbers from './numbers';
6
+ import KeyCodeMap from './keyCodeMap';
7
+ import Clipboard from './clipboard';
8
+
9
+ export const env = Env;
10
+ export const unicode = Unicode;
11
+ export const converter = Converter;
12
+ export const dom = Dom;
13
+ export const numbers = Numbers;
14
+ export const keyCodeMap = KeyCodeMap;
15
+ export const clipboard = Clipboard;
16
+
17
+ export default {
18
+ env,
19
+ unicode,
20
+ converter,
21
+ dom,
22
+ numbers,
23
+ keyCodeMap,
24
+ clipboard
25
+ };