suneditor 3.0.0-beta.9 → 3.0.0-rc.2

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 (380) hide show
  1. package/README.md +65 -57
  2. package/dist/suneditor-contents.min.css +1 -0
  3. package/dist/suneditor.min.css +1 -1
  4. package/dist/suneditor.min.js +1 -1
  5. package/package.json +110 -61
  6. package/src/assets/design/color.css +36 -17
  7. package/src/assets/design/size.css +2 -0
  8. package/src/assets/icons/defaultIcons.js +17 -2
  9. package/src/assets/suneditor-contents.css +51 -16
  10. package/src/assets/suneditor.css +116 -43
  11. package/src/core/config/contextProvider.js +288 -0
  12. package/src/core/config/eventManager.js +188 -0
  13. package/src/core/config/instanceCheck.js +59 -0
  14. package/src/core/config/optionProvider.js +452 -0
  15. package/src/core/editor.js +166 -1637
  16. package/src/core/event/actions/index.js +229 -0
  17. package/src/core/event/effects/common.registry.js +74 -0
  18. package/src/core/event/effects/keydown.registry.js +573 -0
  19. package/src/core/event/effects/ruleHelpers.js +148 -0
  20. package/src/core/event/eventOrchestrator.js +944 -0
  21. package/src/core/event/executor.js +27 -0
  22. package/src/core/{base/eventHandlers → event/handlers}/handler_toolbar.js +27 -28
  23. package/src/core/{base/eventHandlers → event/handlers}/handler_ww_clipboard.js +10 -8
  24. package/src/core/{base/eventHandlers → event/handlers}/handler_ww_dragDrop.js +22 -23
  25. package/src/core/event/handlers/handler_ww_input.js +75 -0
  26. package/src/core/event/handlers/handler_ww_key.js +228 -0
  27. package/src/core/event/handlers/handler_ww_mouse.js +166 -0
  28. package/src/core/event/ports.js +211 -0
  29. package/src/core/event/reducers/keydown.reducer.js +97 -0
  30. package/src/core/event/rules/keydown.rule.arrow.js +63 -0
  31. package/src/core/event/rules/keydown.rule.backspace.js +208 -0
  32. package/src/core/event/rules/keydown.rule.delete.js +132 -0
  33. package/src/core/event/rules/keydown.rule.enter.js +150 -0
  34. package/src/core/event/rules/keydown.rule.tab.js +35 -0
  35. package/src/core/event/support/defaultLineManager.js +136 -0
  36. package/src/core/event/support/selectionState.js +204 -0
  37. package/src/core/kernel/coreKernel.js +320 -0
  38. package/src/core/kernel/kernelInjector.js +19 -0
  39. package/src/core/kernel/store.js +173 -0
  40. package/src/core/{class → logic/dom}/char.js +42 -45
  41. package/src/core/logic/dom/format.js +1075 -0
  42. package/src/core/{class → logic/dom}/html.js +743 -624
  43. package/src/core/logic/dom/inline.js +1847 -0
  44. package/src/core/logic/dom/listFormat.js +601 -0
  45. package/src/core/{class → logic/dom}/nodeTransform.js +92 -72
  46. package/src/core/{class → logic/dom}/offset.js +254 -317
  47. package/src/core/logic/dom/selection.js +754 -0
  48. package/src/core/logic/panel/menu.js +389 -0
  49. package/src/core/logic/panel/toolbar.js +449 -0
  50. package/src/core/logic/panel/viewer.js +761 -0
  51. package/src/core/logic/shell/_commandExecutor.js +380 -0
  52. package/src/core/logic/shell/commandDispatcher.js +241 -0
  53. package/src/core/logic/shell/component.js +970 -0
  54. package/src/core/logic/shell/focusManager.js +110 -0
  55. package/src/core/{base → logic/shell}/history.js +110 -60
  56. package/src/core/logic/shell/pluginManager.js +363 -0
  57. package/src/core/logic/shell/shortcuts.js +130 -0
  58. package/src/core/logic/shell/ui.js +904 -0
  59. package/src/core/schema/context.js +66 -0
  60. package/src/core/schema/frameContext.js +160 -0
  61. package/src/core/schema/options.js +628 -0
  62. package/src/core/section/constructor.js +194 -500
  63. package/src/core/section/documentType.js +297 -222
  64. package/src/events.js +808 -543
  65. package/src/helper/clipboard.js +27 -16
  66. package/src/helper/converter.js +100 -78
  67. package/src/helper/dom/domCheck.js +56 -30
  68. package/src/helper/dom/domQuery.js +159 -89
  69. package/src/helper/dom/domUtils.js +114 -49
  70. package/src/helper/dom/index.js +5 -1
  71. package/src/helper/env.js +26 -26
  72. package/src/helper/index.js +1 -1
  73. package/src/helper/keyCodeMap.js +25 -28
  74. package/src/helper/numbers.js +4 -8
  75. package/src/helper/unicode.js +4 -8
  76. package/src/hooks/base.js +307 -0
  77. package/src/hooks/params.js +130 -0
  78. package/src/interfaces/contracts.js +227 -0
  79. package/src/interfaces/index.js +7 -0
  80. package/src/interfaces/plugins.js +239 -0
  81. package/src/langs/ckb.js +4 -4
  82. package/src/langs/cs.js +4 -4
  83. package/src/langs/da.js +4 -4
  84. package/src/langs/de.js +4 -4
  85. package/src/langs/en.js +4 -4
  86. package/src/langs/es.js +4 -4
  87. package/src/langs/fa.js +4 -4
  88. package/src/langs/fr.js +4 -4
  89. package/src/langs/he.js +4 -4
  90. package/src/langs/hu.js +4 -4
  91. package/src/langs/it.js +4 -4
  92. package/src/langs/ja.js +4 -4
  93. package/src/langs/km.js +4 -4
  94. package/src/langs/ko.js +4 -4
  95. package/src/langs/lv.js +4 -4
  96. package/src/langs/nl.js +4 -4
  97. package/src/langs/pl.js +4 -4
  98. package/src/langs/pt_br.js +13 -13
  99. package/src/langs/ro.js +4 -4
  100. package/src/langs/ru.js +4 -4
  101. package/src/langs/se.js +4 -4
  102. package/src/langs/tr.js +4 -4
  103. package/src/langs/uk.js +4 -4
  104. package/src/langs/ur.js +4 -4
  105. package/src/langs/zh_cn.js +4 -4
  106. package/src/modules/{Browser.js → contract/Browser.js} +119 -128
  107. package/src/modules/{ColorPicker.js → contract/ColorPicker.js} +132 -142
  108. package/src/modules/contract/Controller.js +589 -0
  109. package/src/modules/{Figure.js → contract/Figure.js} +591 -411
  110. package/src/modules/{HueSlider.js → contract/HueSlider.js} +125 -86
  111. package/src/modules/contract/Modal.js +357 -0
  112. package/src/modules/contract/index.js +9 -0
  113. package/src/modules/manager/ApiManager.js +197 -0
  114. package/src/modules/{FileManager.js → manager/FileManager.js} +128 -160
  115. package/src/modules/manager/index.js +5 -0
  116. package/src/modules/{ModalAnchorEditor.js → ui/ModalAnchorEditor.js} +108 -138
  117. package/src/modules/{SelectMenu.js → ui/SelectMenu.js} +119 -120
  118. package/src/modules/{_DragHandle.js → ui/_DragHandle.js} +1 -1
  119. package/src/modules/ui/index.js +6 -0
  120. package/src/plugins/browser/audioGallery.js +23 -26
  121. package/src/plugins/browser/fileBrowser.js +25 -28
  122. package/src/plugins/browser/fileGallery.js +20 -23
  123. package/src/plugins/browser/imageGallery.js +24 -23
  124. package/src/plugins/browser/videoGallery.js +27 -29
  125. package/src/plugins/command/blockquote.js +11 -17
  126. package/src/plugins/command/exportPDF.js +26 -26
  127. package/src/plugins/command/fileUpload.js +138 -133
  128. package/src/plugins/command/list_bulleted.js +48 -44
  129. package/src/plugins/command/list_numbered.js +48 -44
  130. package/src/plugins/dropdown/align.js +64 -50
  131. package/src/plugins/dropdown/backgroundColor.js +34 -35
  132. package/src/plugins/dropdown/{formatBlock.js → blockStyle.js} +43 -37
  133. package/src/plugins/dropdown/font.js +50 -36
  134. package/src/plugins/dropdown/fontColor.js +34 -35
  135. package/src/plugins/dropdown/hr.js +55 -50
  136. package/src/plugins/dropdown/layout.js +20 -15
  137. package/src/plugins/dropdown/lineHeight.js +46 -30
  138. package/src/plugins/dropdown/list.js +32 -33
  139. package/src/plugins/dropdown/paragraphStyle.js +40 -34
  140. package/src/plugins/dropdown/table/index.js +915 -0
  141. package/src/plugins/dropdown/table/render/table.html.js +308 -0
  142. package/src/plugins/dropdown/table/render/table.menu.js +121 -0
  143. package/src/plugins/dropdown/table/services/table.cell.js +465 -0
  144. package/src/plugins/dropdown/table/services/table.clipboard.js +414 -0
  145. package/src/plugins/dropdown/table/services/table.grid.js +504 -0
  146. package/src/plugins/dropdown/table/services/table.resize.js +463 -0
  147. package/src/plugins/dropdown/table/services/table.selection.js +466 -0
  148. package/src/plugins/dropdown/table/services/table.style.js +844 -0
  149. package/src/plugins/dropdown/table/shared/table.constants.js +109 -0
  150. package/src/plugins/dropdown/table/shared/table.utils.js +219 -0
  151. package/src/plugins/dropdown/template.js +20 -15
  152. package/src/plugins/dropdown/textStyle.js +28 -22
  153. package/src/plugins/field/mention.js +54 -49
  154. package/src/plugins/index.js +5 -5
  155. package/src/plugins/input/fontSize.js +100 -97
  156. package/src/plugins/input/pageNavigator.js +13 -10
  157. package/src/plugins/modal/audio.js +208 -219
  158. package/src/plugins/modal/drawing.js +99 -104
  159. package/src/plugins/modal/embed.js +323 -312
  160. package/src/plugins/modal/image/index.js +942 -0
  161. package/src/plugins/modal/image/render/image.html.js +150 -0
  162. package/src/plugins/modal/image/services/image.size.js +198 -0
  163. package/src/plugins/modal/image/services/image.upload.js +216 -0
  164. package/src/plugins/modal/image/shared/image.constants.js +20 -0
  165. package/src/plugins/modal/link.js +74 -54
  166. package/src/plugins/modal/math.js +126 -119
  167. package/src/plugins/modal/video/index.js +858 -0
  168. package/src/plugins/modal/video/render/video.html.js +131 -0
  169. package/src/plugins/modal/video/services/video.size.js +281 -0
  170. package/src/plugins/modal/video/services/video.upload.js +92 -0
  171. package/src/plugins/popup/anchor.js +57 -49
  172. package/src/suneditor.js +73 -61
  173. package/src/themes/cobalt.css +155 -0
  174. package/src/themes/dark.css +143 -120
  175. package/src/typedef.js +214 -63
  176. package/types/assets/icons/defaultIcons.d.ts +8 -0
  177. package/types/assets/suneditor-contents.css.d.ts +1 -0
  178. package/types/assets/suneditor.css.d.ts +1 -0
  179. package/types/core/config/contextProvider.d.ts +148 -0
  180. package/types/core/config/eventManager.d.ts +68 -0
  181. package/types/core/config/instanceCheck.d.ts +33 -0
  182. package/types/core/config/optionProvider.d.ts +147 -0
  183. package/types/core/editor.d.ts +27 -586
  184. package/types/core/event/actions/index.d.ts +50 -0
  185. package/types/core/event/effects/common.registry.d.ts +56 -0
  186. package/types/core/event/effects/keydown.registry.d.ts +80 -0
  187. package/types/core/event/effects/ruleHelpers.d.ts +36 -0
  188. package/types/core/event/eventOrchestrator.d.ts +191 -0
  189. package/types/core/event/executor.d.ts +13 -0
  190. package/types/core/event/handlers/handler_toolbar.d.ts +38 -0
  191. package/types/core/event/handlers/handler_ww_clipboard.d.ts +36 -0
  192. package/types/core/event/handlers/handler_ww_dragDrop.d.ts +26 -0
  193. package/types/core/event/handlers/handler_ww_input.d.ts +38 -0
  194. package/types/core/event/handlers/handler_ww_key.d.ts +40 -0
  195. package/types/core/event/handlers/handler_ww_mouse.d.ts +47 -0
  196. package/types/core/event/ports.d.ts +256 -0
  197. package/types/core/event/reducers/keydown.reducer.d.ts +84 -0
  198. package/types/core/event/rules/keydown.rule.arrow.d.ts +19 -0
  199. package/types/core/event/rules/keydown.rule.backspace.d.ts +18 -0
  200. package/types/core/event/rules/keydown.rule.delete.d.ts +18 -0
  201. package/types/core/event/rules/keydown.rule.enter.d.ts +18 -0
  202. package/types/core/event/rules/keydown.rule.tab.d.ts +18 -0
  203. package/types/core/event/support/defaultLineManager.d.ts +22 -0
  204. package/types/core/event/support/selectionState.d.ts +29 -0
  205. package/types/core/kernel/coreKernel.d.ts +219 -0
  206. package/types/core/kernel/kernelInjector.d.ts +16 -0
  207. package/types/core/kernel/store.d.ts +170 -0
  208. package/types/core/logic/dom/char.d.ts +46 -0
  209. package/types/core/logic/dom/format.d.ts +234 -0
  210. package/types/core/logic/dom/html.d.ts +290 -0
  211. package/types/core/logic/dom/inline.d.ts +93 -0
  212. package/types/core/logic/dom/listFormat.d.ts +101 -0
  213. package/types/core/logic/dom/nodeTransform.d.ts +110 -0
  214. package/types/core/logic/dom/offset.d.ts +335 -0
  215. package/types/core/logic/dom/selection.d.ts +165 -0
  216. package/types/core/logic/panel/menu.d.ts +93 -0
  217. package/types/core/logic/panel/toolbar.d.ts +128 -0
  218. package/types/core/logic/panel/viewer.d.ts +89 -0
  219. package/types/core/logic/shell/_commandExecutor.d.ts +18 -0
  220. package/types/core/logic/shell/commandDispatcher.d.ts +65 -0
  221. package/types/core/logic/shell/component.d.ts +182 -0
  222. package/types/core/logic/shell/focusManager.d.ts +31 -0
  223. package/types/core/{base → logic/shell}/history.d.ts +13 -12
  224. package/types/core/logic/shell/pluginManager.d.ts +115 -0
  225. package/types/core/logic/shell/shortcuts.d.ts +131 -0
  226. package/types/core/logic/shell/ui.d.ts +261 -0
  227. package/types/core/schema/context.d.ts +104 -0
  228. package/types/core/schema/frameContext.d.ts +320 -0
  229. package/types/core/schema/options.d.ts +1241 -0
  230. package/types/core/section/constructor.d.ts +117 -652
  231. package/types/core/section/documentType.d.ts +43 -61
  232. package/types/events.d.ts +796 -65
  233. package/types/helper/clipboard.d.ts +5 -4
  234. package/types/helper/converter.d.ts +55 -43
  235. package/types/helper/dom/domCheck.d.ts +27 -19
  236. package/types/helper/dom/domQuery.d.ts +76 -57
  237. package/types/helper/dom/domUtils.d.ts +62 -39
  238. package/types/helper/dom/index.d.ts +87 -1
  239. package/types/helper/env.d.ts +16 -13
  240. package/types/helper/index.d.ts +8 -2
  241. package/types/helper/keyCodeMap.d.ts +24 -23
  242. package/types/helper/numbers.d.ts +4 -6
  243. package/types/helper/unicode.d.ts +4 -3
  244. package/types/hooks/base.d.ts +239 -0
  245. package/types/hooks/params.d.ts +65 -0
  246. package/types/index.d.ts +20 -117
  247. package/types/interfaces/contracts.d.ts +183 -0
  248. package/types/interfaces/index.d.ts +3 -0
  249. package/types/interfaces/plugins.d.ts +168 -0
  250. package/types/langs/_Lang.d.ts +2 -2
  251. package/types/langs/index.d.ts +2 -2
  252. package/types/modules/contract/Browser.d.ts +262 -0
  253. package/types/modules/contract/ColorPicker.d.ts +99 -0
  254. package/types/modules/contract/Controller.d.ts +204 -0
  255. package/types/modules/contract/Figure.d.ts +529 -0
  256. package/types/modules/{HueSlider.d.ts → contract/HueSlider.d.ts} +39 -28
  257. package/types/modules/contract/Modal.d.ts +62 -0
  258. package/types/modules/contract/index.d.ts +7 -0
  259. package/types/modules/manager/ApiManager.d.ts +106 -0
  260. package/types/modules/manager/FileManager.d.ts +124 -0
  261. package/types/modules/manager/index.d.ts +3 -0
  262. package/types/modules/ui/ModalAnchorEditor.d.ts +152 -0
  263. package/types/modules/ui/SelectMenu.d.ts +107 -0
  264. package/types/modules/{_DragHandle.d.ts → ui/_DragHandle.d.ts} +1 -0
  265. package/types/modules/ui/index.d.ts +4 -0
  266. package/types/plugins/browser/audioGallery.d.ts +33 -41
  267. package/types/plugins/browser/fileBrowser.d.ts +42 -50
  268. package/types/plugins/browser/fileGallery.d.ts +33 -41
  269. package/types/plugins/browser/imageGallery.d.ts +30 -37
  270. package/types/plugins/browser/videoGallery.d.ts +33 -41
  271. package/types/plugins/command/blockquote.d.ts +4 -21
  272. package/types/plugins/command/exportPDF.d.ts +23 -33
  273. package/types/plugins/command/fileUpload.d.ts +80 -100
  274. package/types/plugins/command/list_bulleted.d.ts +9 -35
  275. package/types/plugins/command/list_numbered.d.ts +9 -35
  276. package/types/plugins/dropdown/align.d.ts +23 -46
  277. package/types/plugins/dropdown/backgroundColor.d.ts +35 -53
  278. package/types/plugins/dropdown/blockStyle.d.ts +45 -0
  279. package/types/plugins/dropdown/font.d.ts +18 -41
  280. package/types/plugins/dropdown/fontColor.d.ts +35 -53
  281. package/types/plugins/dropdown/hr.d.ts +26 -52
  282. package/types/plugins/dropdown/layout.d.ts +19 -25
  283. package/types/plugins/dropdown/lineHeight.d.ts +21 -39
  284. package/types/plugins/dropdown/list.d.ts +6 -34
  285. package/types/plugins/dropdown/paragraphStyle.d.ts +34 -45
  286. package/types/plugins/dropdown/table/index.d.ts +158 -0
  287. package/types/plugins/dropdown/table/render/table.html.d.ts +71 -0
  288. package/types/plugins/dropdown/table/render/table.menu.d.ts +59 -0
  289. package/types/plugins/dropdown/table/services/table.cell.d.ts +76 -0
  290. package/types/plugins/dropdown/table/services/table.clipboard.d.ts +26 -0
  291. package/types/plugins/dropdown/table/services/table.grid.d.ts +77 -0
  292. package/types/plugins/dropdown/table/services/table.resize.d.ts +72 -0
  293. package/types/plugins/dropdown/table/services/table.selection.d.ts +59 -0
  294. package/types/plugins/dropdown/table/services/table.style.d.ts +162 -0
  295. package/types/plugins/dropdown/table/shared/table.constants.d.ts +134 -0
  296. package/types/plugins/dropdown/table/shared/table.utils.d.ts +91 -0
  297. package/types/plugins/dropdown/template.d.ts +19 -25
  298. package/types/plugins/dropdown/textStyle.d.ts +23 -30
  299. package/types/plugins/field/mention.d.ts +66 -72
  300. package/types/plugins/index.d.ts +41 -40
  301. package/types/plugins/input/fontSize.d.ts +57 -96
  302. package/types/plugins/input/pageNavigator.d.ts +5 -8
  303. package/types/plugins/modal/audio.d.ts +60 -153
  304. package/types/plugins/modal/drawing.d.ts +16 -118
  305. package/types/plugins/modal/embed.d.ts +46 -166
  306. package/types/plugins/modal/image/index.d.ts +281 -0
  307. package/types/plugins/modal/image/render/image.html.d.ts +45 -0
  308. package/types/plugins/modal/image/services/image.size.d.ts +55 -0
  309. package/types/plugins/modal/image/services/image.upload.d.ts +24 -0
  310. package/types/plugins/modal/image/shared/image.constants.d.ts +17 -0
  311. package/types/plugins/modal/link.d.ts +46 -66
  312. package/types/plugins/modal/math.d.ts +17 -86
  313. package/types/plugins/modal/{video.d.ts → video/index.d.ts} +89 -221
  314. package/types/plugins/modal/video/render/video.html.d.ts +37 -0
  315. package/types/plugins/modal/video/services/video.size.d.ts +74 -0
  316. package/types/plugins/modal/video/services/video.upload.d.ts +19 -0
  317. package/types/plugins/popup/anchor.d.ts +8 -38
  318. package/types/suneditor.d.ts +55 -24
  319. package/types/typedef.d.ts +344 -228
  320. package/CONTRIBUTING.md +0 -186
  321. package/src/core/base/eventHandlers/handler_ww_key_input.js +0 -1200
  322. package/src/core/base/eventHandlers/handler_ww_mouse.js +0 -194
  323. package/src/core/base/eventManager.js +0 -1523
  324. package/src/core/class/component.js +0 -856
  325. package/src/core/class/format.js +0 -3433
  326. package/src/core/class/menu.js +0 -346
  327. package/src/core/class/selection.js +0 -610
  328. package/src/core/class/shortcuts.js +0 -98
  329. package/src/core/class/toolbar.js +0 -431
  330. package/src/core/class/ui.js +0 -424
  331. package/src/core/class/viewer.js +0 -750
  332. package/src/core/section/actives.js +0 -266
  333. package/src/core/section/context.js +0 -102
  334. package/src/editorInjector/_classes.js +0 -36
  335. package/src/editorInjector/_core.js +0 -87
  336. package/src/editorInjector/index.js +0 -73
  337. package/src/modules/ApiManager.js +0 -191
  338. package/src/modules/Controller.js +0 -474
  339. package/src/modules/Modal.js +0 -346
  340. package/src/modules/index.js +0 -14
  341. package/src/plugins/dropdown/table.js +0 -4034
  342. package/src/plugins/modal/image.js +0 -1376
  343. package/src/plugins/modal/video.js +0 -1226
  344. package/types/core/base/eventHandlers/handler_toolbar.d.ts +0 -41
  345. package/types/core/base/eventHandlers/handler_ww_clipboard.d.ts +0 -40
  346. package/types/core/base/eventHandlers/handler_ww_dragDrop.d.ts +0 -35
  347. package/types/core/base/eventHandlers/handler_ww_key_input.d.ts +0 -45
  348. package/types/core/base/eventHandlers/handler_ww_mouse.d.ts +0 -39
  349. package/types/core/base/eventManager.d.ts +0 -401
  350. package/types/core/class/char.d.ts +0 -61
  351. package/types/core/class/component.d.ts +0 -213
  352. package/types/core/class/format.d.ts +0 -623
  353. package/types/core/class/html.d.ts +0 -430
  354. package/types/core/class/menu.d.ts +0 -126
  355. package/types/core/class/nodeTransform.d.ts +0 -93
  356. package/types/core/class/offset.d.ts +0 -522
  357. package/types/core/class/selection.d.ts +0 -188
  358. package/types/core/class/shortcuts.d.ts +0 -142
  359. package/types/core/class/toolbar.d.ts +0 -189
  360. package/types/core/class/ui.d.ts +0 -164
  361. package/types/core/class/viewer.d.ts +0 -140
  362. package/types/core/section/actives.d.ts +0 -46
  363. package/types/core/section/context.d.ts +0 -45
  364. package/types/editorInjector/_classes.d.ts +0 -41
  365. package/types/editorInjector/_core.d.ts +0 -87
  366. package/types/editorInjector/index.d.ts +0 -69
  367. package/types/modules/ApiManager.d.ts +0 -125
  368. package/types/modules/Browser.d.ts +0 -326
  369. package/types/modules/ColorPicker.d.ts +0 -135
  370. package/types/modules/Controller.d.ts +0 -251
  371. package/types/modules/Figure.d.ts +0 -517
  372. package/types/modules/FileManager.d.ts +0 -202
  373. package/types/modules/Modal.d.ts +0 -111
  374. package/types/modules/ModalAnchorEditor.d.ts +0 -236
  375. package/types/modules/SelectMenu.d.ts +0 -194
  376. package/types/modules/index.d.ts +0 -26
  377. package/types/plugins/dropdown/formatBlock.d.ts +0 -55
  378. package/types/plugins/dropdown/table.d.ts +0 -627
  379. package/types/plugins/modal/image.d.ts +0 -451
  380. /package/{LICENSE → LICENSE.txt} +0 -0
@@ -1,610 +0,0 @@
1
- /**
2
- * @fileoverview Selection class
3
- */
4
-
5
- import CoreInjector from '../../editorInjector/_core';
6
- import { dom, unicode, env } from '../../helper';
7
-
8
- /**
9
- * @typedef {Omit<Selection_ & Partial<__se__EditorInjector>, 'selection'>} SelectionThis
10
- */
11
-
12
- /**
13
- * @typedef {import('./offset').RectsInfo} RectsInfo_selection
14
- */
15
-
16
- /**
17
- * @constructor
18
- * @this {SelectionThis}
19
- * @description Selection, Range related class
20
- * @param {__se__EditorCore} editor - The root editor instance
21
- */
22
- function Selection_(editor) {
23
- CoreInjector.call(this, editor);
24
-
25
- // members
26
- /** @type {Range} */
27
- this.range = null;
28
- /** @type {HTMLElement|Text} */
29
- this.selectionNode = null;
30
- this.__iframeFocus = false;
31
- }
32
-
33
- Selection_.prototype = {
34
- /**
35
- * @this {SelectionThis}
36
- * @description Get window selection obejct
37
- * @returns {Selection}
38
- */
39
- get() {
40
- let selection = null;
41
-
42
- if (typeof this.editor._shadowRoot?.getSelection === 'function') {
43
- selection = this.editor._shadowRoot.getSelection();
44
- } else {
45
- selection = this.editor.frameContext.get('_ww').getSelection();
46
- }
47
-
48
- if (!selection) return null;
49
- if (!this.status._range && !this.editor.frameContext.get('wysiwyg').contains(selection.focusNode)) {
50
- selection.removeAllRanges();
51
- selection.addRange(this._createDefaultRange());
52
- }
53
- return selection;
54
- },
55
-
56
- /**
57
- * @this {SelectionThis}
58
- * @description Check if the range object is valid
59
- * @param {*} range Range object
60
- * @returns {boolean}
61
- */
62
- isRange(range) {
63
- // return /Range/.test(Object.prototype.toString.call(range?.__proto__));
64
- return range instanceof Range;
65
- },
66
-
67
- /**
68
- * @this {SelectionThis}
69
- * @description Get current editor's range object
70
- * @returns {Range}
71
- */
72
- getRange() {
73
- const range = this.status._range || this._createDefaultRange();
74
- const selection = this.get();
75
- if (range.collapsed === selection.isCollapsed || !this.editor.frameContext.get('wysiwyg').contains(selection.focusNode)) {
76
- if (this.component.is(range.startContainer)) {
77
- const compInfo = this.component.get(range.startContainer);
78
- const container = compInfo?.container;
79
- if (!container) return range;
80
- return this.setRange(container, 0, container, 1);
81
- }
82
-
83
- return range;
84
- }
85
-
86
- if (selection.rangeCount > 0) {
87
- this.status._range = selection.getRangeAt(0);
88
- return this.status._range;
89
- } else {
90
- const sc = selection.anchorNode,
91
- ec = selection.focusNode,
92
- so = selection.anchorOffset,
93
- eo = selection.focusOffset;
94
- const compareValue = dom.query.compareElements(sc, ec);
95
- const rightDir = compareValue.ancestor && (compareValue.result === 0 ? so <= eo : compareValue.result > 1 ? true : false);
96
- return this.setRange(rightDir ? sc : ec, rightDir ? so : eo, rightDir ? ec : sc, rightDir ? eo : so);
97
- }
98
- },
99
-
100
- /**
101
- * @this {SelectionThis}
102
- * @description Set current editor's range object and return.
103
- * @param {Node|Range} startCon Range object or The startContainer property of the selection object
104
- * @param {number} [startOff] The startOffset property of the selection object.
105
- * @param {Node} [endCon] The endContainer property of the selection object.
106
- * @param {number} [endOff] The endOffset property of the selection object.
107
- * @returns {Range}
108
- */
109
- setRange(startCon, startOff, endCon, endOff) {
110
- /** @type {Node} */
111
- let sc;
112
- /** @type {number} */
113
- let so;
114
- /** @type {Node} */
115
- let ec;
116
- /** @type {number} */
117
- let eo;
118
-
119
- if (this.isRange(startCon)) {
120
- const r = /** @type {Range} */ (startCon);
121
- sc = r.startContainer;
122
- so = r.startOffset;
123
- ec = r.endContainer;
124
- eo = r.endOffset;
125
- } else {
126
- sc = /** @type {Node} */ (startCon);
127
- so = startOff;
128
- ec = endCon;
129
- eo = endOff;
130
- }
131
-
132
- if (!sc || !ec) return;
133
- if ((dom.check.isBreak(sc) || sc.nodeType === 3) && so > sc.textContent.length) so = sc.textContent.length;
134
- if ((dom.check.isBreak(ec) || ec.nodeType === 3) && eo > ec.textContent.length) eo = ec.textContent.length;
135
- if (this.format.isLine(sc)) {
136
- sc = sc.childNodes[so > 0 ? sc.childNodes.length - 1 : 0] || sc;
137
- so = so > 0 ? (sc.nodeType === 1 && !dom.check.isBreak(sc) ? 1 : sc.textContent ? sc.textContent.length : 0) : 0;
138
- }
139
- if (this.format.isLine(ec)) {
140
- ec = ec.childNodes[eo > 0 ? ec.childNodes.length - 1 : 0] || ec;
141
- eo = eo > 0 ? (ec.nodeType === 1 && !dom.check.isBreak(ec) ? 1 : ec.textContent ? ec.textContent.length : 0) : 0;
142
- }
143
-
144
- const range = this.editor.frameContext.get('_wd').createRange();
145
-
146
- try {
147
- range.setStart(sc, so);
148
- range.setEnd(ec, eo);
149
- this.status.hasFocus = true;
150
- } catch (error) {
151
- console.warn('[SUNEDITOR.selection.focus.warn]', error.message);
152
- this.editor._nativeFocus();
153
- return;
154
- }
155
-
156
- const selection = this.get();
157
-
158
- if (selection.removeAllRanges) {
159
- selection.removeAllRanges();
160
- }
161
-
162
- selection.addRange(range);
163
- this.status._range = range;
164
- this._rangeInfo(range, this.get());
165
-
166
- if (this.editor.frameOptions.get('iframe')) this.__focus();
167
-
168
- return range;
169
- },
170
-
171
- /**
172
- * @this {SelectionThis}
173
- * @description Remove range object and button effect
174
- */
175
- removeRange() {
176
- this.status._range = null;
177
- this.selectionNode = null;
178
- this.editor.effectNode = null;
179
- if (this.status.hasFocus) this.get().removeAllRanges();
180
- this.eventManager._setKeyEffect([]);
181
- },
182
-
183
- /**
184
- * @this {SelectionThis}
185
- * @description Returns the range (container and offset) near the given target node.
186
- * - If the target node has a next sibling, it returns the next sibling with an offset of 0.
187
- * - If there is no next sibling but a previous sibling exists, it returns the previous sibling with an offset of 1.
188
- * @param {Node} target Target node whose neighboring range is to be determined.
189
- * @returns {{container: Node, offset: number}|null} An object containing the nearest container node and its offset.
190
- */
191
- getNearRange(target) {
192
- const next = target.nextSibling;
193
- const prev = target.previousSibling;
194
- if (next) {
195
- return {
196
- container: next,
197
- offset: 0
198
- };
199
- } else if (prev) {
200
- return {
201
- container: prev,
202
- offset: 1
203
- };
204
- }
205
-
206
- return null;
207
- },
208
-
209
- /**
210
- * @this {SelectionThis}
211
- * @description If the "range" object is a non-editable area, add a line at the top of the editor and update the "range" object.
212
- * @param {Range} range core.getRange()
213
- * @param {?Node=} container If there is "container" argument, it creates a line in front of the container.
214
- * @returns {Range} a new "range" or argument "range".
215
- */
216
- getRangeAndAddLine(range, container) {
217
- if (this._isNone(range)) {
218
- const parent = container?.parentElement || this.editor.frameContext.get('wysiwyg');
219
- const op = dom.utils.createElement(this.options.get('defaultLine'), null, '<br>');
220
- parent.insertBefore(op, container && container !== parent ? (!(/** @type {HTMLElement} */ (container).previousElementSibling) ? container : /** @type {HTMLElement} */ (container).nextElementSibling) : parent.firstElementChild);
221
- this.setRange(op.firstElementChild, 0, op.firstElementChild, 1);
222
- range = this.status._range;
223
- }
224
- return range;
225
- },
226
-
227
- /**
228
- * @this {SelectionThis}
229
- * @description Get current select node
230
- * @returns {HTMLElement|Text}
231
- */
232
- getNode() {
233
- if (!this.editor.frameContext.get('wysiwyg').contains(this.selectionNode)) this._init();
234
- if (!this.selectionNode) {
235
- const selectionNode = /** @type {HTMLElement|Text} */ (dom.query.getEdgeChild(this.editor.frameContext.get('wysiwyg').firstChild, (current) => current.childNodes.length === 0 || current.nodeType === 3, false));
236
- if (!selectionNode) {
237
- this._init();
238
- } else {
239
- this.selectionNode = selectionNode;
240
- return selectionNode;
241
- }
242
- }
243
- return this.selectionNode;
244
- },
245
-
246
- /**
247
- * @this {SelectionThis}
248
- * @description Get the Rects object.
249
- * @param {?Range|Node} target Range | Node | null
250
- * @param {"start"|"end"} position It is based on the position of the rect object to be returned in case of range selection.
251
- * @returns {{rects: RectsInfo_selection, position: "start"|"end", scrollLeft: number, scrollTop: number}}
252
- */
253
- getRects(target, position) {
254
- const targetAbs = dom.check.isElement(/** @type {Node} */ (target)) ? this._w.getComputedStyle(target).position === 'absolute' : false;
255
- target = /** @type {Range} */ (!target || dom.check.isText(/** @type {Node} */ (target)) ? this.getRange() : target);
256
- const globalScroll = this.offset.getGlobalScroll();
257
- let isStartPosition = position === 'start';
258
- let scrollLeft = globalScroll.left;
259
- let scrollTop = globalScroll.top;
260
-
261
- let rects = /** @type {*} */ (target).getClientRects();
262
- rects = rects[isStartPosition ? 0 : rects.length - 1];
263
-
264
- if (!rects) {
265
- const node = this.getNode();
266
- if (this.format.isLine(node)) {
267
- const zeroWidth = dom.utils.createTextNode(unicode.zeroWidthSpace);
268
- this.html.insertNode(zeroWidth, { afterNode: null, skipCharCount: true });
269
- this.setRange(zeroWidth, 1, zeroWidth, 1);
270
- this._init();
271
- rects = this.getRange().getClientRects();
272
- rects = rects[isStartPosition ? 0 : rects.length - 1];
273
- }
274
-
275
- if (!rects) {
276
- const nodeOffset = this.offset.get(node);
277
- rects = {
278
- left: nodeOffset.left,
279
- top: nodeOffset.top,
280
- right: nodeOffset.left + /** @type {HTMLElement} */ (node).offsetWidth,
281
- bottom: nodeOffset.top + /** @type {HTMLElement} */ (node).offsetHeight,
282
- noText: true
283
- };
284
- scrollLeft = 0;
285
- scrollTop = 0;
286
- }
287
-
288
- isStartPosition = true;
289
- }
290
-
291
- const iframeRects = /^iframe$/i.test(this.editor.frameContext.get('wysiwygFrame').nodeName) ? this.editor.frameContext.get('wysiwygFrame').getClientRects()[0] : null;
292
- if (!targetAbs && iframeRects) {
293
- rects = {
294
- left: rects.left + iframeRects.left,
295
- top: rects.top + iframeRects.top,
296
- right: rects.right + iframeRects.right - iframeRects.width,
297
- bottom: rects.bottom + iframeRects.bottom - iframeRects.height
298
- };
299
- }
300
-
301
- return {
302
- rects: rects,
303
- position: isStartPosition ? 'start' : 'end',
304
- scrollLeft: scrollLeft,
305
- scrollTop: scrollTop
306
- };
307
- },
308
-
309
- /**
310
- * @this {SelectionThis}
311
- * @description Get the custom range object of the event.
312
- * @param {DragEvent} e Event object
313
- * @returns {{sc: Node, so: number, ec: Node, eo: number}} {sc: startContainer, so: startOffset, ec: endContainer, eo: endOffset}
314
- */
315
- getDragEventLocationRange(e) {
316
- const wd = this.editor.frameContext.get('_wd');
317
- let r, sc, so, ec, eo;
318
-
319
- if (wd.caretPositionFromPoint) {
320
- r = wd.caretPositionFromPoint(e.clientX, e.clientY);
321
- sc = r.offsetNode;
322
- so = r.offset;
323
- ec = r.offsetNode;
324
- eo = r.offset;
325
- } else if (wd.caretRangeFromPoint) {
326
- r = wd.caretRangeFromPoint(e.clientX, e.clientY);
327
- sc = r.startContainer;
328
- so = r.startOffset;
329
- ec = r.endContainer;
330
- eo = r.endOffset;
331
- }
332
-
333
- return {
334
- sc,
335
- so,
336
- ec,
337
- eo
338
- };
339
- },
340
-
341
- /**
342
- * @this {SelectionThis}
343
- * @description Scroll to the corresponding selection or range position.
344
- * @param {Selection|Range|Node} ref selection or range object
345
- * @param {?Object<string, *>=} scrollOption option of scrollTo
346
- */
347
- scrollTo(ref, scrollOption) {
348
- if (ref instanceof Selection) {
349
- ref = ref.getRangeAt(0);
350
- } else if (ref instanceof Node) {
351
- ref = this.setRange(ref, 1, ref, 1);
352
- } else if (typeof ref?.startContainer === 'undefined') {
353
- console.warn('[SUNEDITOR.html.scrollTo.warn] "selectionRange" must be Selection or Range or Node object.', ref);
354
- }
355
-
356
- const rect = ref.getBoundingClientRect();
357
- const isVisible = rect.top >= 0 && rect.bottom <= this.editor.frameContext.get('wysiwygFrame').innerHeight;
358
-
359
- if (isVisible) return;
360
-
361
- const el = dom.query.getParentElement(ref.startContainer, (current) => current.nodeType === 1);
362
- el?.scrollIntoView?.(scrollOption || this.options.get('scrollToOptions'));
363
- },
364
-
365
- /**
366
- * @private
367
- * @this {SelectionThis}
368
- * @description Returns true if there is no valid selection.
369
- * @param {Range} range selection.getRange()
370
- * @returns {boolean}
371
- */
372
- _isNone(range) {
373
- const comm = /** @type {HTMLElement} */ (range.commonAncestorContainer);
374
- return (
375
- (dom.check.isWysiwygFrame(range.startContainer) && dom.check.isWysiwygFrame(range.endContainer)) ||
376
- /FIGURE/i.test(comm.nodeName) ||
377
- (this.editor._fileManager.regExp.test(comm.nodeName) && (!this.editor._fileManager.tagAttrs[comm.nodeName] || this.editor._fileManager.tagAttrs[comm.nodeName]?.every((v) => comm.hasAttribute(v)))) ||
378
- this.component.is(comm)
379
- );
380
- },
381
-
382
- /**
383
- * @private
384
- * @this {SelectionThis}
385
- * @description Return the range object of editor's first child node
386
- * @returns {Range}
387
- */
388
- _createDefaultRange() {
389
- const wysiwyg = this.editor.frameContext.get('wysiwyg');
390
- const range = this.editor.frameContext.get('_wd').createRange();
391
-
392
- let firstFormat = wysiwyg.firstElementChild;
393
- let focusEl = null;
394
- if (!firstFormat) {
395
- focusEl = dom.utils.createElement('BR');
396
- firstFormat = dom.utils.createElement(this.options.get('defaultLine'), null, focusEl);
397
- wysiwyg.appendChild(firstFormat);
398
- } else {
399
- focusEl = firstFormat.firstChild;
400
- if (!focusEl) {
401
- focusEl = dom.utils.createElement('BR');
402
- firstFormat.appendChild(focusEl);
403
- }
404
- }
405
-
406
- range.setStart(focusEl, 0);
407
- range.setEnd(focusEl, 0);
408
-
409
- return range;
410
- },
411
-
412
- /**
413
- * @private
414
- * @this {SelectionThis}
415
- * @description Set "range" and "selection" info.
416
- * @param {Range} range range object.
417
- * @param {Selection} selection selection object.
418
- */
419
- _rangeInfo(range, selection) {
420
- let selectionNode = null;
421
- this.status._range = range;
422
-
423
- if (range.collapsed) {
424
- if (dom.check.isWysiwygFrame(range.commonAncestorContainer)) selectionNode = range.commonAncestorContainer.children[range.startOffset] || range.commonAncestorContainer;
425
- else selectionNode = range.commonAncestorContainer;
426
- } else {
427
- selectionNode = selection.anchorNode;
428
- }
429
-
430
- this.selectionNode = /** @type {HTMLElement|Text} */ (selectionNode);
431
- },
432
-
433
- /**
434
- * @private
435
- * @this {SelectionThis}
436
- * @description Saving the range object and the currently selected node of editor
437
- */
438
- _init() {
439
- const activeEl = this.editor.frameContext.get('_wd').activeElement;
440
- if (dom.check.isInputElement(activeEl)) {
441
- this.selectionNode = activeEl;
442
- return activeEl;
443
- }
444
-
445
- const selection = this.get();
446
-
447
- if (!selection) return null;
448
- let range = null;
449
-
450
- if (selection.rangeCount > 0) {
451
- range = selection.getRangeAt(0);
452
- } else {
453
- range = this._createDefaultRange();
454
- }
455
-
456
- this._rangeInfo(range, selection);
457
- },
458
-
459
- /**
460
- * @private
461
- * @this {SelectionThis}
462
- * @description Focus method
463
- */
464
- __focus() {
465
- try {
466
- this.__iframeFocus = true;
467
- const caption = dom.query.getParentElement(this.getNode(), 'figcaption');
468
- if (caption) {
469
- caption.focus();
470
- } else {
471
- this.editor.frameContext.get('wysiwyg').focus();
472
- }
473
- } finally {
474
- env._w.setTimeout(() => (this.__iframeFocus = false), 0);
475
- }
476
- },
477
-
478
- /**
479
- * @private
480
- * @this {SelectionThis}
481
- * @description Reset range object to text node selected status.
482
- * @returns {boolean} Returns false if there is no valid selection.
483
- */
484
- _resetRangeToTextNode() {
485
- let rangeObj = this.getRange();
486
- if (this._isNone(rangeObj)) {
487
- if (!dom.check.isWysiwygFrame(rangeObj.startContainer) || !dom.check.isWysiwygFrame(rangeObj.endContainer)) return false;
488
- const ww = /** @type {HTMLElement} */ (rangeObj.commonAncestorContainer);
489
- const first = ww.children[rangeObj.startOffset];
490
- const end = ww.children[rangeObj.endOffset];
491
- if (!(rangeObj = this.setRange(first, 0, end, first === end ? 0 : 1))) return false;
492
- }
493
-
494
- const range = rangeObj;
495
- const collapsed = range.collapsed;
496
- let startCon = range.startContainer;
497
- let startOff = range.startOffset;
498
- let endCon = range.endContainer;
499
- let endOff = range.endOffset;
500
- let tempCon, tempOffset, tempChild;
501
-
502
- if (this.format.isLine(startCon)) {
503
- if (!startCon.childNodes[startOff]) {
504
- startCon = startCon.lastChild || startCon;
505
- startOff = startCon.textContent.length;
506
- } else {
507
- startCon = startCon.childNodes[startOff] || startCon;
508
- startOff = 0;
509
- }
510
- while (startCon?.nodeType === 1 && startCon.firstChild) {
511
- startCon = startCon.firstChild || startCon;
512
- startOff = 0;
513
- }
514
- }
515
- if (this.format.isLine(endCon)) {
516
- endCon = endCon.childNodes[endOff] || endCon.lastChild || endCon;
517
- while (endCon?.nodeType === 1 && endCon.lastChild) {
518
- endCon = endCon.lastChild;
519
- }
520
- if (collapsed) endOff = 0;
521
- else if (endOff > 0) endOff = endCon.textContent.length;
522
- }
523
-
524
- // startContainer
525
- tempCon = dom.check.isWysiwygFrame(startCon) ? this.editor.frameContext.get('wysiwyg').firstChild : startCon;
526
- tempOffset = startOff;
527
-
528
- if (dom.check.isBreak(tempCon) || (tempCon.nodeType === 1 && tempCon.childNodes.length > 0)) {
529
- const onlyBreak = dom.check.isBreak(tempCon);
530
- if (!onlyBreak) {
531
- const tempConCache = tempCon;
532
- while (tempCon && !dom.check.isBreak(tempCon) && tempCon.nodeType === 1) {
533
- tempChild = tempCon.childNodes;
534
- if (tempChild.length === 0) break;
535
- tempCon = tempChild[tempOffset > 0 ? tempOffset - 1 : tempOffset] || !/FIGURE/i.test(tempChild[0].nodeName) ? tempChild[0] : tempCon.previousElementSibling || tempCon.previousSibling || startCon;
536
- tempOffset = tempOffset > 0 ? tempCon.textContent.length : tempOffset;
537
- }
538
-
539
- let format = this.format.getLine(tempCon, null);
540
- if (format === this.format.getBlock(format, null)) {
541
- tempCon = tempCon || tempConCache;
542
- format = dom.utils.createElement(dom.query.getParentElement(tempCon, dom.check.isTableCell) ? 'DIV' : this.options.get('defaultLine'));
543
- tempCon.parentNode.insertBefore(format, tempCon);
544
- if (tempCon !== tempConCache) format.appendChild(tempCon);
545
- }
546
- }
547
-
548
- if (dom.check.isBreak(tempCon) || this.component.is(tempCon)) {
549
- const emptyText = dom.utils.createTextNode(unicode.zeroWidthSpace);
550
- tempCon.parentNode.insertBefore(emptyText, tempCon);
551
- tempCon = emptyText;
552
- if (onlyBreak) {
553
- if (startCon === endCon) {
554
- endCon = tempCon;
555
- endOff = 1;
556
- }
557
- }
558
- }
559
- }
560
-
561
- // set startContainer
562
- startCon = tempCon;
563
- startOff = tempOffset;
564
-
565
- // endContainer
566
- tempCon = dom.check.isWysiwygFrame(endCon) ? this.editor.frameContext.get('wysiwyg').lastChild : endCon;
567
- tempOffset = endOff;
568
-
569
- if (dom.check.isBreak(tempCon) || (tempCon.nodeType === 1 && tempCon.childNodes.length > 0)) {
570
- const onlyBreak = dom.check.isBreak(tempCon);
571
- if (!onlyBreak) {
572
- while (tempCon && !dom.check.isBreak(tempCon) && tempCon.nodeType === 1) {
573
- tempChild = tempCon.childNodes;
574
- if (tempChild.length === 0) break;
575
- tempCon = tempChild[tempOffset > 0 ? tempOffset - 1 : tempOffset] || !/FIGURE/i.test(tempChild[0].nodeName) ? tempChild[0] : tempCon.previousElementSibling || tempCon.previousSibling || startCon;
576
- tempOffset = tempOffset > 0 ? tempCon.textContent.length : tempOffset;
577
- }
578
-
579
- let format = this.format.getLine(tempCon, null);
580
- if (format === this.format.getBlock(format, null)) {
581
- format = dom.utils.createElement(dom.check.isTableCell(format) ? 'DIV' : this.options.get('defaultLine'));
582
- tempCon.parentNode.insertBefore(format, tempCon);
583
- format.appendChild(tempCon);
584
- }
585
- }
586
-
587
- if (dom.check.isBreak(tempCon)) {
588
- const emptyText = dom.utils.createTextNode(unicode.zeroWidthSpace);
589
- tempCon.parentNode.insertBefore(emptyText, tempCon);
590
- tempCon = emptyText;
591
- tempOffset = 1;
592
- if (onlyBreak && !tempCon.previousSibling) {
593
- dom.utils.removeItem(endCon);
594
- }
595
- }
596
- }
597
-
598
- // set endContainer
599
- endCon = tempCon;
600
- endOff = tempOffset;
601
-
602
- // set Range
603
- this.setRange(startCon, startOff, endCon, endOff);
604
- return true;
605
- },
606
-
607
- constructor: Selection_
608
- };
609
-
610
- export default Selection_;
@@ -1,98 +0,0 @@
1
- /**
2
- * @fileoverview Shortcuts class
3
- */
4
-
5
- import { keyCodeMap } from '../../helper';
6
-
7
- /**
8
- * @typedef {Omit<Shortcuts & Partial<__se__EditorInjector>, 'shortcuts'>} ShortcutsThis
9
- */
10
-
11
- /**
12
- * @typedef {Object} ShortcutInfo
13
- * @property {boolean} c - Whether the [Ctrl, Command] key is pressed.
14
- * @property {boolean} s - Whether the [Shift] key is pressed.
15
- * @property {boolean} space - Whether the [Space] key is pressed.
16
- * @property {boolean} enter - Whether the Enter key is pressed.
17
- * @property {string} command - The command key. (e.g. "bold")
18
- * @property {boolean} edge - Whether the cursor is at the end of the line.
19
- * @property {string=} key - The key pressed (e.g., "1.").
20
- * @property {string=} keyCode - The keyEvent.code.
21
- * @property {string|((...args: *) => *)=} method - A plugin's "shortcut" method that is called instead of the default "editor.run" method.
22
- * @property {string} plugin - The plugin name.
23
- * @property {string} type - Plugin's type. ("command", "dropdown", "modal", "browser", "input", "field", "popup").
24
- * @property {Node} button - The plugin command button.
25
- * @property {Array<string>} r - An array of key codes generated with the reverseButtons option, used to reverse the action for a specific key combination.
26
- * @property {string} textTrigger - Whether the event was triggered by a text input (e.g., mention like @ab).
27
- */
28
-
29
- /**
30
- * @constructor
31
- * @this {ShortcutsThis}
32
- * @description Shortcuts class
33
- * @param {__se__EditorCore} editor - The root editor instance
34
- */
35
- function Shortcuts(editor) {
36
- this.editor = editor;
37
- this.isDisabled = false;
38
- }
39
-
40
- Shortcuts.prototype = {
41
- /**
42
- * @this {ShortcutsThis}
43
- * @description If there is a shortcut function, run it.
44
- * @param {KeyboardEvent} event Keyboard event object
45
- * @param {boolean} ctrl Whether the Ctrl key is pressed
46
- * @param {boolean} shift Whether the Shift key is pressed
47
- * @param {string} keyCode The keyEvent.code.
48
- * @param {string} text The text content of the key
49
- * @param {boolean} edge Whether the cursor is at the end of the line
50
- * @param {HTMLElement} line The current line node
51
- * @param {Range} range The current range object
52
- * @returns {boolean} Whether to execute shortcuts
53
- */
54
- command(event, ctrl, shift, keyCode, text, edge, line, range) {
55
- if (this.isDisabled) return false;
56
-
57
- /** @type {ShortcutInfo} */
58
- let info = null;
59
-
60
- if (ctrl) {
61
- info = this.editor.shortcutsKeyMap.get(keyCode + (shift ? '1000' : ''));
62
- } else {
63
- info = this.editor.shortcutsKeyMap.get(text) || this.editor.shortcutsKeyMap.get(text + event.key);
64
- }
65
-
66
- if (!info || (!shift && info.s) || (info.space && !keyCodeMap.isSpace(keyCode)) || (info.enter && !keyCodeMap.isEnter(keyCode)) || (info.textTrigger && !event.key.trim()) || (info.edge && !edge)) return false;
67
-
68
- if (info.plugin && typeof info.method === 'string') {
69
- this.editor.plugins[info.plugin][info.method]?.({ range, line, info, event, keyCode });
70
- } else if (typeof info.method === 'function') {
71
- info.method({ range, line, info, event, keyCode, editor: this.editor });
72
- } else {
73
- this.editor.run(info.command, info.type, info.button);
74
- }
75
-
76
- return true;
77
- },
78
-
79
- /**
80
- * @this {ShortcutsThis}
81
- * @description Disable the shortcut activation.
82
- */
83
- disable() {
84
- this.isDisabled = true;
85
- },
86
-
87
- /**
88
- * @this {ShortcutsThis}
89
- * @description Enable the shortcut activation.
90
- */
91
- enable() {
92
- this.isDisabled = false;
93
- },
94
-
95
- constructor: Shortcuts
96
- };
97
-
98
- export default Shortcuts;