@lobehub/editor 4.15.1 → 4.16.0

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 (537) hide show
  1. package/es/_virtual/_rolldown/runtime.js +28 -0
  2. package/es/codemirror/components/CopyButton.d.ts +7 -0
  3. package/es/codemirror/components/CopyButton.js +24 -0
  4. package/es/codemirror/components/LanguageSelect.d.ts +7 -0
  5. package/es/codemirror/components/LanguageSelect.js +59 -0
  6. package/es/codemirror/components/MoreOptions.d.ts +7 -0
  7. package/es/codemirror/components/MoreOptions.js +66 -0
  8. package/es/codemirror/components/Toolbar.d.ts +7 -0
  9. package/es/codemirror/components/Toolbar.js +51 -0
  10. package/es/codemirror/components/style.js +7 -0
  11. package/es/codemirror/constants.d.ts +6 -0
  12. package/es/codemirror/constants.js +512 -0
  13. package/es/codemirror/loader.d.ts +61 -0
  14. package/es/codemirror/loader.js +77 -0
  15. package/es/codemirror/style.d.ts +4 -0
  16. package/es/codemirror/style.js +82 -0
  17. package/es/codemirror/theme.d.ts +132 -0
  18. package/es/codemirror/theme.js +75 -0
  19. package/es/codemirror/types.d.ts +53 -0
  20. package/es/codemirror.d.ts +9 -263
  21. package/es/codemirror.js +8 -1
  22. package/es/common/canUseDOM.js +11 -0
  23. package/es/common/sys.js +27 -0
  24. package/es/const/hotkey.js +100 -0
  25. package/es/editor-kernel/data-source.d.ts +15 -0
  26. package/es/editor-kernel/data-source.js +15 -0
  27. package/es/editor-kernel/event.d.ts +7 -0
  28. package/es/editor-kernel/event.js +19 -0
  29. package/es/editor-kernel/index.d.ts +5 -0
  30. package/es/editor-kernel/index.js +17 -0
  31. package/es/editor-kernel/inode/helper.js +87 -0
  32. package/es/editor-kernel/inode/i-element-node.d.ts +6 -0
  33. package/es/editor-kernel/inode/i-node.d.ts +6 -0
  34. package/es/editor-kernel/inode/index.d.ts +4 -0
  35. package/es/editor-kernel/inode/paragraph-node.d.ts +1 -0
  36. package/es/editor-kernel/inode/root-node.d.ts +9 -0
  37. package/es/editor-kernel/inode/text-node.d.ts +9 -0
  38. package/es/editor-kernel/kernel.d.ts +122 -0
  39. package/es/editor-kernel/kernel.js +661 -0
  40. package/es/editor-kernel/plugin.js +59 -0
  41. package/es/editor-kernel/react/LexicalErrorBoundary.d.ts +13 -0
  42. package/es/editor-kernel/react/LexicalErrorBoundary.js +19 -0
  43. package/es/editor-kernel/react/PortalAnchor.js +12 -0
  44. package/es/editor-kernel/react/PortalContainer.d.ts +14 -0
  45. package/es/editor-kernel/react/PortalContainer.js +25 -0
  46. package/es/editor-kernel/react/index.d.ts +5 -0
  47. package/es/editor-kernel/react/react-context.d.ts +11 -0
  48. package/es/editor-kernel/react/react-context.js +21 -0
  49. package/es/editor-kernel/react/react-editor.d.ts +16 -0
  50. package/es/editor-kernel/react/react-editor.js +32 -0
  51. package/es/editor-kernel/react/useAnchor.js +17 -0
  52. package/es/editor-kernel/react/useDecorators.js +60 -0
  53. package/es/editor-kernel/react/useEditable.js +25 -0
  54. package/es/editor-kernel/react/useLexicalEditor.d.ts +6 -0
  55. package/es/editor-kernel/react/useLexicalEditor.js +23 -0
  56. package/es/editor-kernel/react/useLexicalNodeSelection.js +86 -0
  57. package/es/editor-kernel/react/useTranslation.js +9 -0
  58. package/es/editor-kernel/utils.d.ts +46 -0
  59. package/es/editor-kernel/utils.js +138 -0
  60. package/es/headless/extract-media-from-editor-state.d.ts +22 -0
  61. package/es/headless/extract-media-from-editor-state.js +49 -0
  62. package/es/headless/index.d.ts +69 -0
  63. package/es/headless/index.js +189 -0
  64. package/es/headless/plugins/codeblock.js +82 -0
  65. package/es/headless.d.ts +2 -0
  66. package/es/headless.js +782 -20254
  67. package/es/index.d.ts +113 -3059
  68. package/es/index.js +102 -8485
  69. package/es/locale/index.d.ts +63 -0
  70. package/es/locale/index.js +66 -0
  71. package/es/node_modules/.pnpm/@types_mdast@4.0.4/node_modules/@types/mdast/index.d.ts +953 -0
  72. package/es/node_modules/.pnpm/@types_unist@3.0.3/node_modules/@types/unist/index.d.ts +83 -0
  73. package/es/plugins/auto-complete/index.d.ts +2 -0
  74. package/es/plugins/auto-complete/node/placeholderNode.js +89 -0
  75. package/es/plugins/auto-complete/plugin/index.d.ts +31 -0
  76. package/es/plugins/auto-complete/plugin/index.js +395 -0
  77. package/es/plugins/auto-complete/react/ReactAutoCompletePlugin.d.ts +7 -0
  78. package/es/plugins/auto-complete/react/ReactAutoCompletePlugin.js +60 -0
  79. package/es/plugins/auto-complete/react/index.d.ts +1 -0
  80. package/es/plugins/auto-complete/react/style.js +12 -0
  81. package/es/plugins/auto-complete/react/type.d.ts +25 -0
  82. package/es/plugins/block/command/index.d.ts +13 -0
  83. package/es/plugins/block/command/index.js +161 -0
  84. package/es/plugins/block/index.d.ts +5 -0
  85. package/es/plugins/block/plugin/index.d.ts +9 -0
  86. package/es/plugins/block/plugin/index.js +162 -0
  87. package/es/plugins/block/react/ReactBlockPlugin.d.ts +18 -0
  88. package/es/plugins/block/react/ReactBlockPlugin.js +613 -0
  89. package/es/plugins/block/react/core/runtime-context.js +19 -0
  90. package/es/plugins/block/react/core/types.d.ts +6 -0
  91. package/es/plugins/block/react/drag/drag-session.js +264 -0
  92. package/es/plugins/block/react/drag/drag-utils.js +122 -0
  93. package/es/plugins/block/react/index.d.ts +2 -0
  94. package/es/plugins/block/react/style.js +66 -0
  95. package/es/plugins/block/service/i-block-menu-service.d.ts +61 -0
  96. package/es/plugins/block/service/i-block-menu-service.js +67 -0
  97. package/es/plugins/block/service/index.d.ts +1 -0
  98. package/es/plugins/code/command/index.d.ts +7 -0
  99. package/es/plugins/code/command/index.js +30 -0
  100. package/es/plugins/code/index.d.ts +3 -0
  101. package/es/plugins/code/node/code.js +91 -0
  102. package/es/plugins/code/plugin/index.d.ts +9 -0
  103. package/es/plugins/code/plugin/index.js +74 -0
  104. package/es/plugins/code/plugin/registry.js +33 -0
  105. package/es/plugins/code/react/CodeReactPlugin.d.ts +7 -0
  106. package/es/plugins/code/react/CodeReactPlugin.js +27 -0
  107. package/es/plugins/code/react/index.d.ts +1 -0
  108. package/es/plugins/code/react/style.js +21 -0
  109. package/es/plugins/code/react/type.d.ts +7 -0
  110. package/es/plugins/codeblock/command/index.d.ts +8 -0
  111. package/es/plugins/codeblock/command/index.js +40 -0
  112. package/es/plugins/codeblock/index.d.ts +6 -0
  113. package/es/plugins/codeblock/index.js +5 -0
  114. package/es/plugins/codeblock/plugin/CodeHighlighterShiki.js +415 -0
  115. package/es/plugins/codeblock/plugin/FacadeShiki.js +193 -0
  116. package/es/plugins/codeblock/plugin/index.d.ts +16 -0
  117. package/es/plugins/codeblock/plugin/index.js +181 -0
  118. package/es/plugins/codeblock/plugin/invariant.js +14 -0
  119. package/es/plugins/codeblock/react/ReactCodeblockPlugin.d.ts +7 -0
  120. package/es/plugins/codeblock/react/ReactCodeblockPlugin.js +27 -0
  121. package/es/plugins/codeblock/react/index.d.ts +2 -0
  122. package/es/plugins/codeblock/react/style.js +58 -0
  123. package/es/plugins/codeblock/react/type.d.ts +8 -0
  124. package/es/plugins/codeblock/utils/language.js +9 -0
  125. package/es/plugins/codemirror-block/command/index.d.ts +13 -0
  126. package/es/plugins/codemirror-block/command/index.js +67 -0
  127. package/es/plugins/codemirror-block/index.d.ts +3 -0
  128. package/es/plugins/codemirror-block/lib/mode.js +8 -0
  129. package/es/plugins/codemirror-block/node/CodeMirrorNode.d.ts +48 -0
  130. package/es/plugins/codemirror-block/node/CodeMirrorNode.js +205 -0
  131. package/es/plugins/codemirror-block/plugin/index.d.ts +12 -0
  132. package/es/plugins/codemirror-block/plugin/index.js +80 -0
  133. package/es/plugins/codemirror-block/react/CodemirrorNode.js +219 -0
  134. package/es/plugins/codemirror-block/react/ReactCodemirrorNode.d.ts +7 -0
  135. package/es/plugins/codemirror-block/react/ReactCodemirrorNode.js +26 -0
  136. package/es/plugins/codemirror-block/react/index.d.ts +1 -0
  137. package/es/plugins/codemirror-block/react/type.d.ts +6 -0
  138. package/es/plugins/common/command/index.d.ts +11 -0
  139. package/es/plugins/common/command/index.js +24 -0
  140. package/es/plugins/common/data-source/json-data-source.js +133 -0
  141. package/es/plugins/common/data-source/text-data-source.js +32 -0
  142. package/es/plugins/common/index.d.ts +6 -0
  143. package/es/plugins/common/node/ElementDOMSlot.js +30 -0
  144. package/es/plugins/common/node/cursor.d.ts +16 -0
  145. package/es/plugins/common/node/cursor.js +189 -0
  146. package/es/plugins/common/plugin/index.d.ts +43 -0
  147. package/es/plugins/common/plugin/index.js +338 -0
  148. package/es/plugins/common/plugin/mdReader.js +62 -0
  149. package/es/plugins/common/plugin/paste-handler.d.ts +11 -0
  150. package/es/plugins/common/plugin/paste-handler.js +61 -0
  151. package/es/plugins/common/plugin/register.js +306 -0
  152. package/es/plugins/common/react/Placeholder/index.js +65 -0
  153. package/es/plugins/common/react/Placeholder/style.js +22 -0
  154. package/es/plugins/common/react/ReactEditorContent.d.ts +7 -0
  155. package/es/plugins/common/react/ReactEditorContent.js +8 -0
  156. package/es/plugins/common/react/ReactPlainText.d.ts +7 -0
  157. package/es/plugins/common/react/ReactPlainText.js +192 -0
  158. package/es/plugins/common/react/index.d.ts +3 -0
  159. package/es/plugins/common/react/style.js +206 -0
  160. package/es/plugins/common/react/type.d.ts +94 -0
  161. package/es/plugins/common/utils/index.js +135 -0
  162. package/es/plugins/content-blocks/data-source/content-blocks-data-source.d.ts +15 -0
  163. package/es/plugins/content-blocks/data-source/content-blocks-data-source.js +21 -0
  164. package/es/plugins/content-blocks/index.d.ts +6 -0
  165. package/es/plugins/content-blocks/plugin/index.d.ts +10 -0
  166. package/es/plugins/content-blocks/plugin/index.js +24 -0
  167. package/es/plugins/content-blocks/types.d.ts +33 -0
  168. package/es/plugins/content-blocks/types.js +4 -0
  169. package/es/plugins/content-blocks/utils/extract-media-lists.d.ts +7 -0
  170. package/es/plugins/content-blocks/utils/extract-media-lists.js +32 -0
  171. package/es/plugins/content-blocks/utils/extract.d.ts +8 -0
  172. package/es/plugins/content-blocks/utils/extract.js +188 -0
  173. package/es/plugins/file/command/index.d.ts +9 -0
  174. package/es/plugins/file/command/index.js +31 -0
  175. package/es/plugins/file/index.d.ts +4 -0
  176. package/es/plugins/file/node/FileNode.d.ts +38 -0
  177. package/es/plugins/file/node/FileNode.js +106 -0
  178. package/es/plugins/file/plugin/index.d.ts +18 -0
  179. package/es/plugins/file/plugin/index.js +103 -0
  180. package/es/plugins/file/react/ReactFilePlugin.d.ts +7 -0
  181. package/es/plugins/file/react/ReactFilePlugin.js +35 -0
  182. package/es/plugins/file/react/components/ReactFile.js +50 -0
  183. package/es/plugins/file/react/index.d.ts +2 -0
  184. package/es/plugins/file/react/style.js +32 -0
  185. package/es/plugins/file/react/type.d.ts +17 -0
  186. package/es/plugins/file/utils/index.js +29 -0
  187. package/es/plugins/hr/command/index.d.ts +7 -0
  188. package/es/plugins/hr/command/index.js +14 -0
  189. package/es/plugins/hr/index.d.ts +4 -0
  190. package/es/plugins/hr/node/HorizontalRuleNode.d.ts +18 -0
  191. package/es/plugins/hr/node/HorizontalRuleNode.js +59 -0
  192. package/es/plugins/hr/plugin/index.d.ts +12 -0
  193. package/es/plugins/hr/plugin/index.js +60 -0
  194. package/es/plugins/hr/react/ReactHRPlugin.d.ts +7 -0
  195. package/es/plugins/hr/react/ReactHRPlugin.js +28 -0
  196. package/es/plugins/hr/react/components/HRNode.js +36 -0
  197. package/es/plugins/hr/react/index.d.ts +2 -0
  198. package/es/plugins/hr/react/style.js +32 -0
  199. package/es/plugins/hr/react/type.d.ts +6 -0
  200. package/es/plugins/image/command/index.d.ts +12 -0
  201. package/es/plugins/image/command/index.js +53 -0
  202. package/es/plugins/image/index.d.ts +4 -0
  203. package/es/plugins/image/node/basie-image-node.d.ts +33 -0
  204. package/es/plugins/image/node/basie-image-node.js +68 -0
  205. package/es/plugins/image/node/block-image-node.d.ts +43 -0
  206. package/es/plugins/image/node/block-image-node.js +137 -0
  207. package/es/plugins/image/node/image-node.d.ts +41 -0
  208. package/es/plugins/image/node/image-node.js +128 -0
  209. package/es/plugins/image/plugin/index.d.ts +24 -0
  210. package/es/plugins/image/plugin/index.js +183 -0
  211. package/es/plugins/image/react/ReactImagePlugin.d.ts +7 -0
  212. package/es/plugins/image/react/ReactImagePlugin.js +41 -0
  213. package/es/plugins/image/react/components/BrokenImage.js +16 -0
  214. package/es/plugins/image/react/components/Image.js +190 -0
  215. package/es/plugins/image/react/components/ImageEditPopover.js +160 -0
  216. package/es/plugins/image/react/components/LazyImage.js +73 -0
  217. package/es/plugins/image/react/components/ResizeHandle.js +62 -0
  218. package/es/plugins/image/react/components/style.js +135 -0
  219. package/es/plugins/image/react/components/useSupenseImage.js +22 -0
  220. package/es/plugins/image/react/index.d.ts +2 -0
  221. package/es/plugins/image/react/style.js +31 -0
  222. package/es/plugins/image/react/type.d.ts +23 -0
  223. package/es/plugins/inode/index.d.ts +3 -0
  224. package/es/plugins/inode/plugin/index.d.ts +19 -0
  225. package/es/plugins/inode/plugin/index.js +23 -0
  226. package/es/plugins/inode/react/index.d.ts +6 -0
  227. package/es/plugins/inode/react/index.js +15 -0
  228. package/es/plugins/inode/service/index.d.ts +17 -0
  229. package/es/plugins/inode/service/index.js +22 -0
  230. package/es/plugins/link/command/index.d.ts +10 -0
  231. package/es/plugins/link/command/index.js +33 -0
  232. package/es/plugins/link/index.d.ts +5 -0
  233. package/es/plugins/link/node/LinkNode.d.ts +10 -0
  234. package/es/plugins/link/node/LinkNode.js +448 -0
  235. package/es/plugins/link/plugin/index.d.ts +16 -0
  236. package/es/plugins/link/plugin/index.js +106 -0
  237. package/es/plugins/link/plugin/registry.js +82 -0
  238. package/es/plugins/link/react/ReactLinkPlugin.d.ts +7 -0
  239. package/es/plugins/link/react/ReactLinkPlugin.js +50 -0
  240. package/es/plugins/link/react/components/LinkEdit.js +204 -0
  241. package/es/plugins/link/react/components/LinkToolbar.js +148 -0
  242. package/es/plugins/link/react/index.d.ts +2 -0
  243. package/es/plugins/link/react/style.js +34 -0
  244. package/es/plugins/link/react/type.d.ts +14 -0
  245. package/es/plugins/link/service/i-link-service.d.ts +10 -0
  246. package/es/plugins/link/service/i-link-service.js +19 -0
  247. package/es/plugins/link/utils/index.js +45 -0
  248. package/es/plugins/link-highlight/command/index.d.ts +8 -0
  249. package/es/plugins/link-highlight/command/index.js +30 -0
  250. package/es/plugins/link-highlight/index.d.ts +3 -0
  251. package/es/plugins/link-highlight/node/link-highlight.js +80 -0
  252. package/es/plugins/link-highlight/plugin/index.d.ts +18 -0
  253. package/es/plugins/link-highlight/plugin/index.js +109 -0
  254. package/es/plugins/link-highlight/plugin/registry.js +33 -0
  255. package/es/plugins/link-highlight/react/ReactLinkHighlightPlugin.d.ts +7 -0
  256. package/es/plugins/link-highlight/react/ReactLinkHighlightPlugin.js +29 -0
  257. package/es/plugins/link-highlight/react/index.d.ts +1 -0
  258. package/es/plugins/link-highlight/react/style.js +14 -0
  259. package/es/plugins/link-highlight/react/type.d.ts +16 -0
  260. package/es/plugins/list/command/index.d.ts +3 -0
  261. package/es/plugins/list/command/index.js +3 -0
  262. package/es/plugins/list/index.d.ts +5 -0
  263. package/es/plugins/list/plugin/checkList.d.ts +6 -0
  264. package/es/plugins/list/plugin/checkList.js +140 -0
  265. package/es/plugins/list/plugin/index.d.ts +9 -0
  266. package/es/plugins/list/plugin/index.js +195 -0
  267. package/es/plugins/list/plugin/registry.js +68 -0
  268. package/es/plugins/list/react/ReactListPlugin.d.ts +7 -0
  269. package/es/plugins/list/react/ReactListPlugin.js +21 -0
  270. package/es/plugins/list/react/index.d.ts +2 -0
  271. package/es/plugins/list/react/style.js +123 -0
  272. package/es/plugins/list/react/type.d.ts +7 -0
  273. package/es/plugins/list/utils/index.js +58 -0
  274. package/es/plugins/litexml/command/diffCommand.d.ts +17 -0
  275. package/es/plugins/litexml/command/diffCommand.js +97 -0
  276. package/es/plugins/litexml/command/index.d.ts +38 -0
  277. package/es/plugins/litexml/command/index.js +333 -0
  278. package/es/plugins/litexml/data-source/litexml-data-source.d.ts +65 -0
  279. package/es/plugins/litexml/data-source/litexml-data-source.js +286 -0
  280. package/es/plugins/litexml/index.d.ts +7 -0
  281. package/es/plugins/litexml/node/DiffNode.d.ts +29 -0
  282. package/es/plugins/litexml/node/DiffNode.js +95 -0
  283. package/es/plugins/litexml/plugin/index.d.ts +24 -0
  284. package/es/plugins/litexml/plugin/index.js +106 -0
  285. package/es/plugins/litexml/react/DiffNodeToolbar/index.js +60 -0
  286. package/es/plugins/litexml/react/DiffNodeToolbar/style.js +24 -0
  287. package/es/plugins/litexml/react/hooks/useHasDiffNode.d.ts +7 -0
  288. package/es/plugins/litexml/react/hooks/useHasDiffNode.js +35 -0
  289. package/es/plugins/litexml/react/index.d.ts +6 -0
  290. package/es/plugins/litexml/react/index.js +26 -0
  291. package/es/plugins/litexml/react/style.js +124 -0
  292. package/es/plugins/litexml/service/litexml-service.d.ts +93 -0
  293. package/es/plugins/litexml/service/litexml-service.js +42 -0
  294. package/es/plugins/litexml/utils/index.js +59 -0
  295. package/es/plugins/markdown/command/index.d.ts +14 -0
  296. package/es/plugins/markdown/command/index.js +74 -0
  297. package/es/plugins/markdown/data-source/markdown/parse.d.ts +14 -0
  298. package/es/plugins/markdown/data-source/markdown/parse.js +195 -0
  299. package/es/plugins/markdown/data-source/markdown-data-source.js +148 -0
  300. package/es/plugins/markdown/data-source/markdown-writer-context.js +40 -0
  301. package/es/plugins/markdown/index.d.ts +7 -0
  302. package/es/plugins/markdown/plugin/index.d.ts +22 -0
  303. package/es/plugins/markdown/plugin/index.js +285 -0
  304. package/es/plugins/markdown/react/index.d.ts +6 -0
  305. package/es/plugins/markdown/react/index.js +31 -0
  306. package/es/plugins/markdown/service/shortcut.d.ts +57 -0
  307. package/es/plugins/markdown/service/shortcut.js +101 -0
  308. package/es/plugins/markdown/service/transformers.d.ts +61 -0
  309. package/es/plugins/markdown/service/transformers.js +119 -0
  310. package/es/plugins/markdown/utils/detectLanguage.d.ts +22 -0
  311. package/es/plugins/markdown/utils/detectLanguage.js +251 -0
  312. package/es/plugins/markdown/utils/index.d.ts +11 -0
  313. package/es/plugins/markdown/utils/index.js +143 -0
  314. package/es/plugins/markdown/utils/logger.js +6 -0
  315. package/es/plugins/math/command/index.d.ts +9 -0
  316. package/es/plugins/math/command/index.js +38 -0
  317. package/es/plugins/math/index.d.ts +3 -0
  318. package/es/plugins/math/node/index.d.ts +44 -0
  319. package/es/plugins/math/node/index.js +161 -0
  320. package/es/plugins/math/plugin/index.d.ts +15 -0
  321. package/es/plugins/math/plugin/index.js +119 -0
  322. package/es/plugins/math/react/components/MathEditor.js +198 -0
  323. package/es/plugins/math/react/components/MathEditorContainer.js +101 -0
  324. package/es/plugins/math/react/components/MathEditorContent.js +133 -0
  325. package/es/plugins/math/react/components/MathInline.js +86 -0
  326. package/es/plugins/math/react/components/Placeholder.js +24 -0
  327. package/es/plugins/math/react/index.d.ts +7 -0
  328. package/es/plugins/math/react/index.js +35 -0
  329. package/es/plugins/math/react/style.js +96 -0
  330. package/es/plugins/math/react/type.d.ts +17 -0
  331. package/es/plugins/math/utils/index.js +23 -0
  332. package/es/plugins/mention/command/index.d.ts +10 -0
  333. package/es/plugins/mention/command/index.js +18 -0
  334. package/es/plugins/mention/index.d.ts +5 -0
  335. package/es/plugins/mention/node/MentionNode.d.ts +28 -0
  336. package/es/plugins/mention/node/MentionNode.js +86 -0
  337. package/es/plugins/mention/plugin/index.d.ts +18 -0
  338. package/es/plugins/mention/plugin/index.js +63 -0
  339. package/es/plugins/mention/plugin/register.js +30 -0
  340. package/es/plugins/mention/react/ReactMentionPlugin.d.ts +7 -0
  341. package/es/plugins/mention/react/ReactMentionPlugin.js +36 -0
  342. package/es/plugins/mention/react/components/Mention.js +33 -0
  343. package/es/plugins/mention/react/index.d.ts +2 -0
  344. package/es/plugins/mention/react/style.js +34 -0
  345. package/es/plugins/mention/react/type.d.ts +12 -0
  346. package/es/plugins/slash/index.d.ts +6 -0
  347. package/es/plugins/slash/plugin/index.d.ts +27 -0
  348. package/es/plugins/slash/plugin/index.js +160 -0
  349. package/es/plugins/slash/react/ReactSlashOption.d.ts +7 -0
  350. package/es/plugins/slash/react/ReactSlashOption.js +8 -0
  351. package/es/plugins/slash/react/ReactSlashPlugin.d.ts +7 -0
  352. package/es/plugins/slash/react/ReactSlashPlugin.js +190 -0
  353. package/es/plugins/slash/react/components/DefaultSlashMenu.js +168 -0
  354. package/es/plugins/slash/react/components/SlashMenu.d.ts +11 -0
  355. package/es/plugins/slash/react/components/SlashMenu.js +40 -0
  356. package/es/plugins/slash/react/index.d.ts +4 -0
  357. package/es/plugins/slash/react/type.d.ts +114 -0
  358. package/es/plugins/slash/react/utils.js +18 -0
  359. package/es/plugins/slash/service/i-slash-service.d.ts +50 -0
  360. package/es/plugins/slash/service/i-slash-service.js +55 -0
  361. package/es/plugins/slash/utils/utils.d.ts +1 -0
  362. package/es/plugins/slash/utils/utils.js +97 -0
  363. package/es/plugins/table/command/index.d.ts +29 -0
  364. package/es/plugins/table/command/index.js +238 -0
  365. package/es/plugins/table/index.d.ts +4 -0
  366. package/es/plugins/table/node/index.d.ts +2 -0
  367. package/es/plugins/table/node/index.js +146 -0
  368. package/es/plugins/table/plugin/index.d.ts +14 -0
  369. package/es/plugins/table/plugin/index.js +361 -0
  370. package/es/plugins/table/react/TableActionMenu/ActionMenu.js +296 -0
  371. package/es/plugins/table/react/TableActionMenu/index.js +133 -0
  372. package/es/plugins/table/react/TableActionMenu/style.js +20 -0
  373. package/es/plugins/table/react/TableActionMenu/utils.js +34 -0
  374. package/es/plugins/table/react/TableColController.js +354 -0
  375. package/es/plugins/table/react/TableController/hooks.js +201 -0
  376. package/es/plugins/table/react/TableController/style.js +264 -0
  377. package/es/plugins/table/react/TableController/utils.js +25 -0
  378. package/es/plugins/table/react/TableControllerButton.js +81 -0
  379. package/es/plugins/table/react/TableControllerMenu.js +123 -0
  380. package/es/plugins/table/react/TableHoverActions/index.js +147 -0
  381. package/es/plugins/table/react/TableHoverActions/style.js +14 -0
  382. package/es/plugins/table/react/TableHoverActions/utils.js +32 -0
  383. package/es/plugins/table/react/TableInsertButton.js +25 -0
  384. package/es/plugins/table/react/TableResize/index.js +328 -0
  385. package/es/plugins/table/react/TableResize/style.js +16 -0
  386. package/es/plugins/table/react/TableResize/utils.js +9 -0
  387. package/es/plugins/table/react/TableRowController.js +349 -0
  388. package/es/plugins/table/react/hooks.js +77 -0
  389. package/es/plugins/table/react/index.d.ts +7 -0
  390. package/es/plugins/table/react/index.js +172 -0
  391. package/es/plugins/table/react/style.js +144 -0
  392. package/es/plugins/table/react/type.d.ts +10 -0
  393. package/es/plugins/table/react/useAutoFitPastedTable.js +189 -0
  394. package/es/plugins/table/service/i-table-controller-menu-service.d.ts +44 -0
  395. package/es/plugins/table/service/i-table-controller-menu-service.js +31 -0
  396. package/es/plugins/table/service/index.d.ts +1 -0
  397. package/es/plugins/table/utils/autoFitColumnWidth.js +87 -0
  398. package/es/plugins/table/utils/distributeColumnWidth.js +37 -0
  399. package/es/plugins/table/utils/index.js +148 -0
  400. package/es/plugins/toolbar/command/index.d.ts +12 -0
  401. package/es/plugins/toolbar/command/index.js +17 -0
  402. package/es/plugins/toolbar/index.d.ts +2 -0
  403. package/es/plugins/toolbar/react/index.d.ts +7 -0
  404. package/es/plugins/toolbar/react/index.js +109 -0
  405. package/es/plugins/toolbar/react/style.js +55 -0
  406. package/es/plugins/toolbar/react/type.d.ts +9 -0
  407. package/es/plugins/toolbar/utils/getDOMRangeRect.js +20 -0
  408. package/es/plugins/toolbar/utils/setFloatingElemPosition.js +50 -0
  409. package/es/plugins/upload/index.d.ts +2 -0
  410. package/es/plugins/upload/plugin/index.d.ts +6 -0
  411. package/es/plugins/upload/plugin/index.js +47 -0
  412. package/es/plugins/upload/service/i-upload-service.d.ts +13 -0
  413. package/es/plugins/upload/service/i-upload-service.js +30 -0
  414. package/es/plugins/upload/utils/index.js +15 -0
  415. package/es/plugins/virtual-block/index.d.ts +2 -0
  416. package/es/plugins/virtual-block/plugin/index.d.ts +8 -0
  417. package/es/plugins/virtual-block/plugin/index.js +19 -0
  418. package/es/plugins/virtual-block/plugin/register.js +150 -0
  419. package/es/plugins/virtual-block/react/ReactVirtualBlock.d.ts +6 -0
  420. package/es/plugins/virtual-block/react/ReactVirtualBlock.js +15 -0
  421. package/es/plugins/virtual-block/react/index.d.ts +1 -0
  422. package/es/react/ChatInput/ChatInput.d.ts +7 -0
  423. package/es/react/ChatInput/ChatInput.js +91 -0
  424. package/es/react/ChatInput/index.d.ts +2 -0
  425. package/es/react/ChatInput/style.js +115 -0
  426. package/es/react/ChatInput/type.d.ts +32 -0
  427. package/es/react/ChatInputActionBar/ChatInputActionBar.d.ts +7 -0
  428. package/es/react/ChatInputActionBar/ChatInputActionBar.js +22 -0
  429. package/es/react/ChatInputActionBar/index.d.ts +2 -0
  430. package/es/react/ChatInputActionBar/style.js +7 -0
  431. package/es/react/ChatInputActionBar/type.d.ts +10 -0
  432. package/es/react/ChatInputActions/ChatInputActions.d.ts +7 -0
  433. package/es/react/ChatInputActions/ChatInputActions.js +65 -0
  434. package/es/react/ChatInputActions/components/ActionItem.js +46 -0
  435. package/es/react/ChatInputActions/components/ActionRender.js +45 -0
  436. package/es/react/ChatInputActions/components/CollapsedActions.js +60 -0
  437. package/es/react/ChatInputActions/components/useDisplayActionCount.js +45 -0
  438. package/es/react/ChatInputActions/index.d.ts +2 -0
  439. package/es/react/ChatInputActions/style.js +20 -0
  440. package/es/react/ChatInputActions/type.d.ts +36 -0
  441. package/es/react/CodeLanguageSelect/CodeLanguageSelect.d.ts +7 -0
  442. package/es/react/CodeLanguageSelect/CodeLanguageSelect.js +67 -0
  443. package/es/react/CodeLanguageSelect/index.d.ts +2 -0
  444. package/es/react/CodeLanguageSelect/style.js +7 -0
  445. package/es/react/CodeLanguageSelect/type.d.ts +6 -0
  446. package/es/react/Editor/Editor.js +108 -0
  447. package/es/react/Editor/index.d.ts +16 -0
  448. package/es/react/Editor/index.js +11 -0
  449. package/es/react/Editor/type.d.ts +64 -0
  450. package/es/react/Editor/utils.d.ts +6 -0
  451. package/es/react/Editor/utils.js +6 -0
  452. package/es/react/EditorProvider/index.d.ts +28 -0
  453. package/es/react/EditorProvider/index.js +18 -0
  454. package/es/react/FloatActions/FloatActions.d.ts +7 -0
  455. package/es/react/FloatActions/FloatActions.js +34 -0
  456. package/es/react/FloatActions/components/ActionItem.js +46 -0
  457. package/es/react/FloatActions/components/ActionRender.js +45 -0
  458. package/es/react/FloatActions/components/CollapsedActions.js +60 -0
  459. package/es/react/FloatActions/index.d.ts +2 -0
  460. package/es/react/FloatActions/style.js +19 -0
  461. package/es/react/FloatActions/type.d.ts +33 -0
  462. package/es/react/FloatMenu/FloatMenu.d.ts +7 -0
  463. package/es/react/FloatMenu/FloatMenu.js +32 -0
  464. package/es/react/FloatMenu/index.d.ts +2 -0
  465. package/es/react/FloatMenu/style.js +28 -0
  466. package/es/react/FloatMenu/type.d.ts +25 -0
  467. package/es/react/SendButton/SendButton.d.ts +7 -0
  468. package/es/react/SendButton/SendButton.js +107 -0
  469. package/es/react/SendButton/components/SendIcon.js +23 -0
  470. package/es/react/SendButton/components/StopIcon.js +56 -0
  471. package/es/react/SendButton/index.d.ts +2 -0
  472. package/es/react/SendButton/style.js +68 -0
  473. package/es/react/SendButton/type.d.ts +12 -0
  474. package/es/react/SlashMenu/SlashMenu.d.ts +7 -0
  475. package/es/react/SlashMenu/SlashMenu.js +40 -0
  476. package/es/react/SlashMenu/index.d.ts +2 -0
  477. package/es/react/SlashMenu/type.d.ts +17 -0
  478. package/es/react/hooks/useEditor.d.ts +5 -0
  479. package/es/react/hooks/useEditor.js +8 -0
  480. package/es/react/hooks/useEditorState/index.d.ts +71 -0
  481. package/es/react/hooks/useEditorState/index.js +347 -0
  482. package/es/react/hooks/useEditorState/utils.js +28 -0
  483. package/es/react/hooks/useSize.js +61 -0
  484. package/es/react.d.ts +22 -334
  485. package/es/react.js +13 -1573
  486. package/es/renderer/LexicalDiff.d.ts +41 -0
  487. package/es/renderer/LexicalDiff.js +96 -0
  488. package/es/renderer/LexicalRenderer.d.ts +16 -0
  489. package/es/renderer/LexicalRenderer.js +48 -0
  490. package/es/renderer/diff/compute.js +396 -0
  491. package/es/renderer/diff/style.d.ts +4 -0
  492. package/es/renderer/diff/style.js +104 -0
  493. package/es/renderer/diff/types.d.ts +32 -0
  494. package/es/renderer/engine/render-builtin-node.js +196 -0
  495. package/es/renderer/engine/render-text-node.js +33 -0
  496. package/es/renderer/engine/render-tree.js +35 -0
  497. package/es/renderer/engine/shiki.d.ts +4 -0
  498. package/es/renderer/engine/shiki.js +24 -0
  499. package/es/renderer/engine/utils.js +16 -0
  500. package/es/renderer/nodes/index.d.ts +6 -0
  501. package/es/renderer/nodes/index.js +44 -0
  502. package/es/renderer/renderers/codeblock.js +21 -0
  503. package/es/renderer/renderers/file.js +29 -0
  504. package/es/renderer/renderers/horizontalrule.js +29 -0
  505. package/es/renderer/renderers/image.js +35 -0
  506. package/es/renderer/renderers/index.d.ts +6 -0
  507. package/es/renderer/renderers/index.js +21 -0
  508. package/es/renderer/renderers/math.js +19 -0
  509. package/es/renderer/renderers/mention.js +15 -0
  510. package/es/renderer/renderers/mermaid.js +17 -0
  511. package/es/renderer/style.js +52 -0
  512. package/es/renderer/types.d.ts +29 -0
  513. package/es/renderer.d.ts +8 -114
  514. package/es/renderer.js +5 -1153
  515. package/es/types/hotkey.d.ts +76 -0
  516. package/es/types/hotkey.js +65 -0
  517. package/es/types/index.d.ts +2 -0
  518. package/es/types/kernel.d.ts +359 -0
  519. package/es/types/locale.d.ts +11 -0
  520. package/es/utils/cx.js +4 -0
  521. package/es/utils/debug.d.ts +425 -0
  522. package/es/{debug-CIvbNHJu.js → utils/debug.js} +3 -35
  523. package/es/utils/hotkey/isHotkeyMatch.js +17 -0
  524. package/es/utils/hotkey/parseHotkeys.js +53 -0
  525. package/es/utils/hotkey/registerHotkey.d.ts +18 -0
  526. package/es/utils/hotkey/registerHotkey.js +35 -0
  527. package/es/utils/scrollIntoView.d.ts +8 -0
  528. package/es/utils/scrollIntoView.js +29 -0
  529. package/es/utils/updatePosition.js +26 -0
  530. package/es/utils/url.d.ts +18 -0
  531. package/es/utils/url.js +34 -0
  532. package/package.json +4 -1
  533. package/es/ReactSlashPlugin-BiVy_Iwf.js +0 -23072
  534. package/es/codemirror-3POv7f__.js +0 -923
  535. package/es/index-DHGp94p0.d.ts +0 -916
  536. package/es/style-DADgHVA1.js +0 -2889
  537. package/es/style-DMdPzCo-.js +0 -999
@@ -0,0 +1,10 @@
1
+ import { BaseSelection, DOMConversionMap, EditorConfig, ElementNode, LexicalCommand, LexicalEditor, LexicalNode, LexicalUpdateJSON, NodeKey, RangeSelection, SerializedElementNode, Spread } from "lexical";
2
+
3
+ //#region src/plugins/link/node/LinkNode.d.ts
4
+ type LinkAttributes = {
5
+ rel?: null | string;
6
+ target?: null | string;
7
+ title?: null | string;
8
+ };
9
+ //#endregion
10
+ export { LinkAttributes };
@@ -0,0 +1,448 @@
1
+ import { createDebugLogger, init_debug } from "../../../utils/debug.js";
2
+ import { assert, init_utils } from "../../../editor-kernel/utils.js";
3
+ import { $applyNodeReplacement, $getSelection, $isElementNode, $isNodeSelection, $isRangeSelection, $normalizeSelection__EXPERIMENTAL, $setSelection, ElementNode, createCommand } from "lexical";
4
+ import { $findMatchingParent, addClassNamesToElement, isHTMLAnchorElement } from "@lexical/utils";
5
+ //#region src/plugins/link/node/LinkNode.ts
6
+ init_utils();
7
+ init_debug();
8
+ const logger = createDebugLogger("plugin", "link");
9
+ const SUPPORTED_URL_PROTOCOLS = new Set([
10
+ "http:",
11
+ "https:",
12
+ "mailto:",
13
+ "sms:",
14
+ "tel:"
15
+ ]);
16
+ const HOVER_LINK_COMMAND = createCommand("HOVER_LINK_COMMAND");
17
+ const HOVER_OUT_LINK_COMMAND = createCommand("HOVER_OUT_LINK_COMMAND");
18
+ /** @noInheritDoc */
19
+ var LinkNode = class LinkNode extends ElementNode {
20
+ static getType() {
21
+ return "link";
22
+ }
23
+ static clone(node) {
24
+ return new LinkNode(node.__url, {
25
+ rel: node.__rel,
26
+ target: node.__target,
27
+ title: node.__title
28
+ }, node.__key);
29
+ }
30
+ constructor(url = "", attributes = {}, key) {
31
+ super(key);
32
+ const { target = null, rel = null, title = null } = attributes;
33
+ this.__url = url;
34
+ this.__target = target;
35
+ this.__rel = rel;
36
+ this.__title = title;
37
+ }
38
+ createDOM(config, editor) {
39
+ logger.debug("🔍 config", config);
40
+ const element = document.createElement("a");
41
+ this.updateLinkDOM(null, element, config);
42
+ addClassNamesToElement(element, config.theme.link);
43
+ element.addEventListener("mouseenter", (event) => {
44
+ if (event.target instanceof HTMLElement) {
45
+ event.target.classList.add("hover");
46
+ editor.dispatchCommand(HOVER_LINK_COMMAND, {
47
+ event,
48
+ linkNode: this
49
+ });
50
+ }
51
+ });
52
+ element.addEventListener("mouseleave", (event) => {
53
+ if (event.target instanceof HTMLElement) {
54
+ event.target.classList.remove("hover");
55
+ editor.dispatchCommand(HOVER_OUT_LINK_COMMAND, { event });
56
+ }
57
+ });
58
+ return element;
59
+ }
60
+ updateLinkDOM(prevNode, anchor, _config) {
61
+ if (isHTMLAnchorElement(anchor)) {
62
+ if (!prevNode || prevNode.__url !== this.__url) anchor.href = this.sanitizeUrl(this.__url);
63
+ for (const attr of [
64
+ "target",
65
+ "rel",
66
+ "title"
67
+ ]) {
68
+ const key = `__${attr}`;
69
+ const value = this[key];
70
+ if (!prevNode || prevNode[key] !== value) if (value) anchor[attr] = value;
71
+ else anchor.removeAttribute(attr);
72
+ }
73
+ }
74
+ }
75
+ updateDOM(prevNode, anchor, config) {
76
+ this.updateLinkDOM(prevNode, anchor, config);
77
+ return false;
78
+ }
79
+ static importDOM() {
80
+ return { a: () => ({
81
+ conversion: $convertAnchorElement,
82
+ priority: 1
83
+ }) };
84
+ }
85
+ static importJSON(serializedNode) {
86
+ return $createLinkNode().updateFromJSON(serializedNode);
87
+ }
88
+ updateFromJSON(serializedNode) {
89
+ return super.updateFromJSON(serializedNode).setURL(serializedNode.url).setRel(serializedNode.rel || null).setTarget(serializedNode.target || null).setTitle(serializedNode.title || null);
90
+ }
91
+ sanitizeUrl(url) {
92
+ url = formatUrl(url);
93
+ try {
94
+ const parsedUrl = new URL(formatUrl(url));
95
+ if (!SUPPORTED_URL_PROTOCOLS.has(parsedUrl.protocol)) return "about:blank";
96
+ } catch {
97
+ return url;
98
+ }
99
+ return url;
100
+ }
101
+ exportJSON() {
102
+ return {
103
+ ...super.exportJSON(),
104
+ rel: this.getRel(),
105
+ target: this.getTarget(),
106
+ title: this.getTitle(),
107
+ url: this.getURL()
108
+ };
109
+ }
110
+ getURL() {
111
+ return this.getLatest().__url;
112
+ }
113
+ setURL(url) {
114
+ const writable = this.getWritable();
115
+ writable.__url = url;
116
+ return writable;
117
+ }
118
+ getTarget() {
119
+ return this.getLatest().__target;
120
+ }
121
+ setTarget(target) {
122
+ const writable = this.getWritable();
123
+ writable.__target = target;
124
+ return writable;
125
+ }
126
+ getRel() {
127
+ return this.getLatest().__rel;
128
+ }
129
+ setRel(rel) {
130
+ const writable = this.getWritable();
131
+ writable.__rel = rel;
132
+ return writable;
133
+ }
134
+ getTitle() {
135
+ return this.getLatest().__title;
136
+ }
137
+ setTitle(title) {
138
+ const writable = this.getWritable();
139
+ writable.__title = title;
140
+ return writable;
141
+ }
142
+ insertNewAfter(_, restoreSelection = true) {
143
+ const linkNode = $createLinkNode(this.__url, {
144
+ rel: this.__rel,
145
+ target: this.__target,
146
+ title: this.__title
147
+ });
148
+ this.insertAfter(linkNode, restoreSelection);
149
+ return linkNode;
150
+ }
151
+ canInsertTextBefore() {
152
+ return false;
153
+ }
154
+ canInsertTextAfter() {
155
+ return false;
156
+ }
157
+ canBeEmpty() {
158
+ return false;
159
+ }
160
+ isInline() {
161
+ return true;
162
+ }
163
+ extractWithChild(child, selection) {
164
+ if (!$isRangeSelection(selection)) return false;
165
+ const anchorNode = selection.anchor.getNode();
166
+ const focusNode = selection.focus.getNode();
167
+ return this.isParentOf(anchorNode) && this.isParentOf(focusNode) && selection.getTextContent().length > 0;
168
+ }
169
+ isEmailURI() {
170
+ return this.__url.startsWith("mailto:");
171
+ }
172
+ isWebSiteURI() {
173
+ return this.__url.startsWith("https://") || this.__url.startsWith("http://");
174
+ }
175
+ };
176
+ function $convertAnchorElement(domNode) {
177
+ let node = null;
178
+ if (isHTMLAnchorElement(domNode)) {
179
+ const content = domNode.textContent;
180
+ if (content !== null && content !== "" || domNode.children.length > 0) node = $createLinkNode(domNode.getAttribute("href") || "", {
181
+ rel: domNode.getAttribute("rel"),
182
+ target: domNode.getAttribute("target"),
183
+ title: domNode.getAttribute("title")
184
+ });
185
+ }
186
+ return { node };
187
+ }
188
+ /**
189
+ * Takes a URL and creates a LinkNode.
190
+ * @param url - The URL the LinkNode should direct to.
191
+ * @param attributes - Optional HTML a tag attributes \\{ target, rel, title \\}
192
+ * @returns The LinkNode.
193
+ */
194
+ function $createLinkNode(url = "", attributes) {
195
+ return $applyNodeReplacement(new LinkNode(url, attributes));
196
+ }
197
+ /**
198
+ * Determines if node is a LinkNode.
199
+ * @param node - The node to be checked.
200
+ * @returns true if node is a LinkNode, false otherwise.
201
+ */
202
+ function $isLinkNode(node) {
203
+ return node instanceof LinkNode;
204
+ }
205
+ var AutoLinkNode = class AutoLinkNode extends LinkNode {
206
+ constructor(url = "", attributes = {}, key) {
207
+ super(url, attributes, key);
208
+ this.__isUnlinked = attributes.isUnlinked !== void 0 && attributes.isUnlinked !== null ? attributes.isUnlinked : false;
209
+ }
210
+ static getType() {
211
+ return "autolink";
212
+ }
213
+ static clone(node) {
214
+ return new AutoLinkNode(node.__url, {
215
+ isUnlinked: node.__isUnlinked,
216
+ rel: node.__rel,
217
+ target: node.__target,
218
+ title: node.__title
219
+ }, node.__key);
220
+ }
221
+ getIsUnlinked() {
222
+ return this.__isUnlinked;
223
+ }
224
+ setIsUnlinked(value) {
225
+ const self = this.getWritable();
226
+ self.__isUnlinked = value;
227
+ return self;
228
+ }
229
+ createDOM(config, editor) {
230
+ logger.debug("🔍 config", config);
231
+ if (this.__isUnlinked) return document.createElement("span");
232
+ else return super.createDOM(config, editor);
233
+ }
234
+ updateDOM(prevNode, anchor, config) {
235
+ return super.updateDOM(prevNode, anchor, config) || prevNode.__isUnlinked !== this.__isUnlinked;
236
+ }
237
+ static importJSON(serializedNode) {
238
+ return $createAutoLinkNode().updateFromJSON(serializedNode);
239
+ }
240
+ updateFromJSON(serializedNode) {
241
+ return super.updateFromJSON(serializedNode).setIsUnlinked(serializedNode.isUnlinked || false);
242
+ }
243
+ static importDOM() {
244
+ return null;
245
+ }
246
+ exportJSON() {
247
+ return {
248
+ ...super.exportJSON(),
249
+ isUnlinked: this.__isUnlinked
250
+ };
251
+ }
252
+ insertNewAfter(selection, restoreSelection = true) {
253
+ const element = this.getParentOrThrow().insertNewAfter(selection, restoreSelection);
254
+ if ($isElementNode(element)) {
255
+ const linkNode = $createAutoLinkNode(this.__url, {
256
+ isUnlinked: this.__isUnlinked,
257
+ rel: this.__rel,
258
+ target: this.__target,
259
+ title: this.__title
260
+ });
261
+ element.append(linkNode);
262
+ return linkNode;
263
+ }
264
+ return null;
265
+ }
266
+ };
267
+ /**
268
+ * Takes a URL and creates an AutoLinkNode. AutoLinkNodes are generally automatically generated
269
+ * during typing, which is especially useful when a button to generate a LinkNode is not practical.
270
+ * @param url - The URL the LinkNode should direct to.
271
+ * @param attributes - Optional HTML a tag attributes. \\{ target, rel, title \\}
272
+ * @returns The LinkNode.
273
+ */
274
+ function $createAutoLinkNode(url = "", attributes) {
275
+ return $applyNodeReplacement(new AutoLinkNode(url, attributes));
276
+ }
277
+ /**
278
+ * Determines if node is an AutoLinkNode.
279
+ * @param node - The node to be checked.
280
+ * @returns true if node is an AutoLinkNode, false otherwise.
281
+ */
282
+ function $isAutoLinkNode(node) {
283
+ return node instanceof AutoLinkNode;
284
+ }
285
+ const TOGGLE_LINK_COMMAND = createCommand("TOGGLE_LINK_COMMAND");
286
+ function $getPointNode(point, offset) {
287
+ if (point.type === "element") {
288
+ const node = point.getNode();
289
+ assert($isElementNode(node), "$getPointNode: element point is not an ElementNode");
290
+ return node.getChildren()[point.offset + offset] || null;
291
+ }
292
+ return null;
293
+ }
294
+ /**
295
+ * Preserve the logical start/end of a RangeSelection in situations where
296
+ * the point is an element that may be reparented in the callback.
297
+ *
298
+ * @param $fn The function to run
299
+ * @returns The result of the callback
300
+ */
301
+ function $withSelectedNodes($fn) {
302
+ const initialSelection = $getSelection();
303
+ if (!$isRangeSelection(initialSelection)) return $fn();
304
+ const normalized = $normalizeSelection__EXPERIMENTAL(initialSelection);
305
+ const isBackwards = normalized.isBackward();
306
+ const anchorNode = $getPointNode(normalized.anchor, isBackwards ? -1 : 0);
307
+ const focusNode = $getPointNode(normalized.focus, isBackwards ? 0 : -1);
308
+ const rval = $fn();
309
+ if (anchorNode || focusNode) {
310
+ const updatedSelection = $getSelection();
311
+ if ($isRangeSelection(updatedSelection)) {
312
+ const finalSelection = updatedSelection.clone();
313
+ if (anchorNode) {
314
+ const anchorParent = anchorNode.getParent();
315
+ if (anchorParent) finalSelection.anchor.set(anchorParent.getKey(), anchorNode.getIndexWithinParent() + (isBackwards ? 1 : 0), "element");
316
+ }
317
+ if (focusNode) {
318
+ const focusParent = focusNode.getParent();
319
+ if (focusParent) finalSelection.focus.set(focusParent.getKey(), focusNode.getIndexWithinParent() + (isBackwards ? 0 : 1), "element");
320
+ }
321
+ $setSelection($normalizeSelection__EXPERIMENTAL(finalSelection));
322
+ }
323
+ }
324
+ return rval;
325
+ }
326
+ /**
327
+ * Generates or updates a LinkNode. It can also delete a LinkNode if the URL is null,
328
+ * but saves any children and brings them up to the parent node.
329
+ * @param url - The URL the link directs to.
330
+ * @param attributes - Optional HTML a tag attributes. \\{ target, rel, title \\}
331
+ */
332
+ function $toggleLink(url, attributes = {}) {
333
+ const { target, title } = attributes;
334
+ const rel = attributes.rel === void 0 ? "noreferrer" : attributes.rel;
335
+ const selection = $getSelection();
336
+ if (selection === null || !$isRangeSelection(selection) && !$isNodeSelection(selection)) return;
337
+ if ($isNodeSelection(selection)) {
338
+ const nodes = selection.getNodes();
339
+ if (nodes.length === 0) return;
340
+ nodes.forEach((node) => {
341
+ if (url === null) {
342
+ const linkParent = $findMatchingParent(node, (parent) => !$isAutoLinkNode(parent) && $isLinkNode(parent));
343
+ if (linkParent) {
344
+ linkParent.insertBefore(node);
345
+ if (linkParent.getChildren().length === 0) linkParent.remove();
346
+ }
347
+ } else {
348
+ const existingLink = $findMatchingParent(node, (parent) => !$isAutoLinkNode(parent) && $isLinkNode(parent));
349
+ if (existingLink) {
350
+ existingLink.setURL(url);
351
+ if (target !== void 0) existingLink.setTarget(target);
352
+ if (rel !== void 0) existingLink.setRel(rel);
353
+ } else {
354
+ const linkNode = $createLinkNode(url, {
355
+ rel,
356
+ target
357
+ });
358
+ node.insertBefore(linkNode);
359
+ linkNode.append(node);
360
+ }
361
+ }
362
+ });
363
+ return;
364
+ }
365
+ const nodes = selection.extract();
366
+ if (url === null) {
367
+ nodes.forEach((node) => {
368
+ const parentLink = $findMatchingParent(node, (parent) => !$isAutoLinkNode(parent) && $isLinkNode(parent));
369
+ if (parentLink) {
370
+ const children = parentLink.getChildren();
371
+ for (const child of children) parentLink.insertBefore(child);
372
+ parentLink.remove();
373
+ }
374
+ });
375
+ return;
376
+ }
377
+ const updatedNodes = /* @__PURE__ */ new Set();
378
+ const updateLinkNode = (linkNode) => {
379
+ if (updatedNodes.has(linkNode.getKey())) return;
380
+ updatedNodes.add(linkNode.getKey());
381
+ linkNode.setURL(url);
382
+ if (target !== void 0) linkNode.setTarget(target);
383
+ if (rel !== void 0) linkNode.setRel(rel);
384
+ if (title !== void 0) linkNode.setTitle(title);
385
+ };
386
+ if (nodes.length === 1) {
387
+ const firstNode = nodes[0];
388
+ const linkNode = $getAncestor(firstNode, $isLinkNode);
389
+ if (linkNode !== null) return updateLinkNode(linkNode);
390
+ }
391
+ $withSelectedNodes(() => {
392
+ let linkNode = null;
393
+ for (const node of nodes) {
394
+ if (!node.isAttached()) continue;
395
+ const parentLinkNode = $getAncestor(node, $isLinkNode);
396
+ if (parentLinkNode) {
397
+ updateLinkNode(parentLinkNode);
398
+ continue;
399
+ }
400
+ if ($isElementNode(node)) {
401
+ if (!node.isInline()) continue;
402
+ if ($isLinkNode(node)) {
403
+ if (!$isAutoLinkNode(node) && (linkNode === null || !linkNode.getParentOrThrow().isParentOf(node))) {
404
+ updateLinkNode(node);
405
+ linkNode = node;
406
+ continue;
407
+ }
408
+ for (const child of node.getChildren()) node.insertBefore(child);
409
+ node.remove();
410
+ continue;
411
+ }
412
+ }
413
+ const prevLinkNode = node.getPreviousSibling();
414
+ if ($isLinkNode(prevLinkNode) && prevLinkNode.is(linkNode)) {
415
+ prevLinkNode.append(node);
416
+ continue;
417
+ }
418
+ linkNode = $createLinkNode(url, {
419
+ rel,
420
+ target,
421
+ title
422
+ });
423
+ node.insertAfter(linkNode);
424
+ linkNode.append(node);
425
+ }
426
+ });
427
+ }
428
+ function $getAncestor(node, predicate) {
429
+ let parent = node;
430
+ while (parent !== null && parent.getParent() !== null && !predicate(parent)) parent = parent.getParentOrThrow();
431
+ return predicate(parent) ? parent : null;
432
+ }
433
+ const PHONE_NUMBER_REGEX = /^\+?[\d\s()-]{5,}$/;
434
+ /**
435
+ * Formats a URL string by adding appropriate protocol if missing
436
+ *
437
+ * @param url - URL to format
438
+ * @returns Formatted URL with appropriate protocol
439
+ */
440
+ function formatUrl(url) {
441
+ if (/^[a-z][\d+.a-z-]*:/i.test(url)) return url;
442
+ else if (/^[#./]/.test(url)) return url;
443
+ else if (url.includes("@")) return `mailto:${url}`;
444
+ else if (PHONE_NUMBER_REGEX.test(url)) return `tel:${url}`;
445
+ return url;
446
+ }
447
+ //#endregion
448
+ export { $createLinkNode, $isLinkNode, $toggleLink, AutoLinkNode, HOVER_LINK_COMMAND, HOVER_OUT_LINK_COMMAND, LinkNode, TOGGLE_LINK_COMMAND, formatUrl };
@@ -0,0 +1,16 @@
1
+ import { IEditorPluginConstructor } from "../../../types/kernel.js";
2
+ import { LinkAttributes } from "../node/LinkNode.js";
3
+
4
+ //#region src/plugins/link/plugin/index.d.ts
5
+ interface LinkPluginOptions {
6
+ attributes?: LinkAttributes;
7
+ enableHotkey?: boolean;
8
+ linkRegex?: RegExp;
9
+ theme?: {
10
+ link?: string;
11
+ };
12
+ validateUrl?: (url: string) => boolean;
13
+ }
14
+ declare const LinkPlugin: IEditorPluginConstructor<LinkPluginOptions>;
15
+ //#endregion
16
+ export { LinkPlugin, LinkPluginOptions };
@@ -0,0 +1,106 @@
1
+ import { INodeHelper, init_helper } from "../../../editor-kernel/inode/helper.js";
2
+ import { KernelPlugin, init_plugin } from "../../../editor-kernel/plugin.js";
3
+ import { ILitexmlService } from "../../litexml/service/litexml-service.js";
4
+ import { IMarkdownShortCutService } from "../../markdown/service/shortcut.js";
5
+ import { $createLinkNode, $isLinkNode, AutoLinkNode, LinkNode } from "../node/LinkNode.js";
6
+ import { INSERT_LINK_COMMAND, registerLinkCommand } from "../command/index.js";
7
+ import { ILinkService, LinkService } from "../service/i-link-service.js";
8
+ import { registerLinkCommands } from "./registry.js";
9
+ import { $createTextNode, COMMAND_PRIORITY_NORMAL, PASTE_COMMAND } from "lexical";
10
+ //#region src/plugins/link/plugin/index.ts
11
+ init_helper();
12
+ init_plugin();
13
+ const LinkPlugin = class extends KernelPlugin {
14
+ static {
15
+ this.pluginName = "LinkPlugin";
16
+ }
17
+ constructor(kernel, config) {
18
+ super();
19
+ this.kernel = kernel;
20
+ this.config = config;
21
+ this.linkRegex = /^https?:\/\/\S+$/;
22
+ this.service = new LinkService();
23
+ kernel.registerNodes([LinkNode, AutoLinkNode]);
24
+ kernel.registerService(ILinkService, this.service);
25
+ if (config?.theme) kernel.registerThemes(config.theme);
26
+ if (config?.linkRegex) this.linkRegex = config.linkRegex;
27
+ }
28
+ onInit(editor) {
29
+ this.register(registerLinkCommand(editor));
30
+ this.register(registerLinkCommands(editor, this.kernel, {
31
+ attributes: this.config?.attributes,
32
+ enableHotkey: this.config?.enableHotkey,
33
+ validateUrl: this.config?.validateUrl
34
+ }));
35
+ this.register(editor.registerCommand(PASTE_COMMAND, (payload) => {
36
+ const { clipboardData } = payload;
37
+ if (clipboardData && clipboardData.types && clipboardData.types.length === 1 && clipboardData.types[0] === "text/plain") {
38
+ const data = clipboardData.getData("text/plain").trim();
39
+ if (this.linkRegex.test(data)) {
40
+ payload.stopImmediatePropagation();
41
+ payload.preventDefault();
42
+ editor.dispatchCommand(INSERT_LINK_COMMAND, { url: data });
43
+ return true;
44
+ }
45
+ }
46
+ return false;
47
+ }, COMMAND_PRIORITY_NORMAL));
48
+ this.registerMarkdown();
49
+ this.registerLiteXml();
50
+ }
51
+ registerLiteXml() {
52
+ const litexmlService = this.kernel.requireService(ILitexmlService);
53
+ if (!litexmlService) return;
54
+ litexmlService.registerXMLWriter(LinkNode.getType(), (node, ctx) => {
55
+ if ($isLinkNode(node)) {
56
+ const attributes = { href: node.getURL() };
57
+ return ctx.createXmlNode("a", attributes);
58
+ }
59
+ return false;
60
+ });
61
+ litexmlService.registerXMLReader("a", (xmlNode, children) => {
62
+ return [INodeHelper.createElementNode("link", {
63
+ children,
64
+ direction: "ltr",
65
+ format: "",
66
+ indent: 0,
67
+ type: "link",
68
+ url: xmlNode.getAttribute("href") || "",
69
+ version: 1
70
+ })];
71
+ });
72
+ }
73
+ registerMarkdown() {
74
+ this.kernel.requireService(IMarkdownShortCutService)?.registerMarkdownShortCut({
75
+ regExp: /\[([^[]+)]\(([^\s()]+)(?:\s"((?:[^"]*\\")*[^"]*)"\s*)?\)\s?$/,
76
+ replace: (textNode, match) => {
77
+ const [, linkText, linkUrl, linkTitle] = match;
78
+ const linkNode = $createLinkNode(linkUrl, { title: linkTitle });
79
+ const linkTextNode = $createTextNode(linkText);
80
+ linkTextNode.setFormat(textNode.getFormat());
81
+ linkNode.append(linkTextNode);
82
+ textNode.replace(linkNode);
83
+ return linkTextNode;
84
+ },
85
+ trigger: ")",
86
+ type: "text-match"
87
+ });
88
+ this.kernel.requireService(IMarkdownShortCutService)?.registerMarkdownWriter(LinkNode.getType(), (ctx, node) => {
89
+ if ($isLinkNode(node)) ctx.wrap("[", `](${node.getURL()})`);
90
+ });
91
+ this.kernel.requireService(IMarkdownShortCutService)?.registerMarkdownReader("link", (node, children) => {
92
+ return [INodeHelper.createElementNode("link", {
93
+ children,
94
+ direction: "ltr",
95
+ format: "",
96
+ indent: 0,
97
+ title: node.title || void 0,
98
+ type: "link",
99
+ url: node.url || "",
100
+ version: 1
101
+ })];
102
+ });
103
+ }
104
+ };
105
+ //#endregion
106
+ export { LinkPlugin };
@@ -0,0 +1,82 @@
1
+ import { HotkeyEnum, init_hotkey } from "../../../types/hotkey.js";
2
+ import { $isLinkNode, $toggleLink, TOGGLE_LINK_COMMAND, formatUrl } from "../node/LinkNode.js";
3
+ import { extractUrlFromText, getSelectedNode, sanitizeUrl } from "../utils/index.js";
4
+ import { $getSelection, $isRangeSelection, COMMAND_PRIORITY_LOW } from "lexical";
5
+ import { mergeRegister } from "@lexical/utils";
6
+ //#region src/plugins/link/plugin/registry.ts
7
+ init_hotkey();
8
+ function registerLinkCommands(editor, kernel, options) {
9
+ const { validateUrl, attributes, enableHotkey = true } = options || {};
10
+ const state = { isLink: false };
11
+ const registrations = [editor.registerUpdateListener(() => {
12
+ const selection = editor.getEditorState().read(() => $getSelection());
13
+ if (!selection) return;
14
+ if ($isRangeSelection(selection)) editor.getEditorState().read(() => {
15
+ const node = getSelectedNode(selection);
16
+ state.isLink = $isLinkNode(node.getParent()) || $isLinkNode(node);
17
+ });
18
+ else state.isLink = false;
19
+ }), editor.registerCommand(TOGGLE_LINK_COMMAND, (payload) => {
20
+ if (payload === null) {
21
+ $toggleLink(payload);
22
+ return true;
23
+ } else if (typeof payload === "string") {
24
+ if (validateUrl === void 0 || validateUrl(payload)) {
25
+ $toggleLink(payload, attributes);
26
+ return true;
27
+ }
28
+ return false;
29
+ } else {
30
+ const { url, target, rel, title } = payload;
31
+ $toggleLink(url, {
32
+ ...attributes,
33
+ rel,
34
+ target,
35
+ title
36
+ });
37
+ return true;
38
+ }
39
+ }, COMMAND_PRIORITY_LOW)];
40
+ registrations.push(kernel.registerHotkey(HotkeyEnum.Link, () => {
41
+ if (state.isLink) {
42
+ editor.dispatchCommand(TOGGLE_LINK_COMMAND, null);
43
+ return;
44
+ }
45
+ let nextUrl = sanitizeUrl("https://");
46
+ let expandTo = null;
47
+ editor.getEditorState().read(() => {
48
+ const selection = $getSelection();
49
+ if ($isRangeSelection(selection)) if (!selection.isCollapsed()) {
50
+ const maybeUrl = formatUrl(selection.getTextContent().trim());
51
+ if (validateUrl?.(maybeUrl)) nextUrl = maybeUrl;
52
+ } else {
53
+ const found = extractUrlFromText(selection.anchor.getNode().getTextContent());
54
+ if (found && validateUrl?.(formatUrl(found.url))) {
55
+ nextUrl = formatUrl(found.url);
56
+ expandTo = {
57
+ index: found.index,
58
+ length: found.length
59
+ };
60
+ }
61
+ }
62
+ });
63
+ editor.update(() => {
64
+ if (expandTo) {
65
+ const selection = $getSelection();
66
+ if ($isRangeSelection(selection)) {
67
+ const anchorNode = selection.anchor.getNode();
68
+ selection.anchor.set(anchorNode.getKey(), expandTo.index, "text");
69
+ selection.focus.set(anchorNode.getKey(), expandTo.index + expandTo.length, "text");
70
+ }
71
+ }
72
+ editor.dispatchCommand(TOGGLE_LINK_COMMAND, nextUrl);
73
+ });
74
+ }, {
75
+ enabled: enableHotkey,
76
+ preventDefault: true,
77
+ stopPropagation: true
78
+ }));
79
+ return mergeRegister(...registrations);
80
+ }
81
+ //#endregion
82
+ export { registerLinkCommands };
@@ -0,0 +1,7 @@
1
+ import { ReactLinkPluginProps } from "./type.js";
2
+ import { FC } from "react";
3
+
4
+ //#region src/plugins/link/react/ReactLinkPlugin.d.ts
5
+ declare const ReactLinkPlugin: FC<ReactLinkPluginProps>;
6
+ //#endregion
7
+ export { ReactLinkPlugin };