@gravity-ui/markdown-editor 15.1.0 → 15.2.1

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 (299) hide show
  1. package/build/cjs/bundle/Editor.d.ts +3 -0
  2. package/build/cjs/bundle/Editor.js +21 -2
  3. package/build/cjs/bundle/Editor.js.map +1 -1
  4. package/build/cjs/bundle/MarkdownEditorView.js +2 -1
  5. package/build/cjs/bundle/MarkdownEditorView.js.map +1 -1
  6. package/build/cjs/bundle/MarkupEditorView.js +6 -1
  7. package/build/cjs/bundle/MarkupEditorView.js.map +1 -1
  8. package/build/cjs/bundle/MarkupManager.d.ts +3 -6
  9. package/build/cjs/bundle/MarkupManager.js +5 -5
  10. package/build/cjs/bundle/MarkupManager.js.map +1 -1
  11. package/build/cjs/bundle/WysiwygEditorView.js +6 -1
  12. package/build/cjs/bundle/WysiwygEditorView.js.map +1 -1
  13. package/build/cjs/bundle/types.d.ts +2 -0
  14. package/build/cjs/bundle/types.js.map +1 -1
  15. package/build/cjs/bundle/useMarkdownEditor.js +4 -2
  16. package/build/cjs/bundle/useMarkdownEditor.js.map +1 -1
  17. package/build/cjs/core/Editor.d.ts +3 -1
  18. package/build/cjs/core/Editor.js +6 -3
  19. package/build/cjs/core/Editor.js.map +1 -1
  20. package/build/cjs/core/ExtensionBuilder.d.ts +3 -1
  21. package/build/cjs/core/ExtensionBuilder.js +6 -1
  22. package/build/cjs/core/ExtensionBuilder.js.map +1 -1
  23. package/build/cjs/core/ExtensionsManager.d.ts +4 -2
  24. package/build/cjs/core/ExtensionsManager.js +6 -5
  25. package/build/cjs/core/ExtensionsManager.js.map +1 -1
  26. package/build/cjs/core/ParserTokensRegistry.d.ts +6 -0
  27. package/build/cjs/core/ParserTokensRegistry.js +9 -1
  28. package/build/cjs/core/ParserTokensRegistry.js.map +1 -1
  29. package/build/cjs/core/index.d.ts +1 -0
  30. package/build/cjs/core/index.js +3 -1
  31. package/build/cjs/core/index.js.map +1 -1
  32. package/build/cjs/core/markdown/MarkdownParser.d.ts +9 -1
  33. package/build/cjs/core/markdown/MarkdownParser.js +7 -3
  34. package/build/cjs/core/markdown/MarkdownParser.js.map +1 -1
  35. package/build/cjs/core/utils/logger.d.ts +3 -0
  36. package/build/cjs/core/utils/logger.js +12 -0
  37. package/build/cjs/core/utils/logger.js.map +1 -0
  38. package/build/cjs/core/utils/metrics.d.ts +2 -1
  39. package/build/cjs/core/utils/metrics.js +8 -2
  40. package/build/cjs/core/utils/metrics.js.map +1 -1
  41. package/build/cjs/extensions/additional/YfmHtmlBlock/utils.d.ts +1 -1
  42. package/build/cjs/extensions/additional/YfmHtmlBlock/utils.js +2 -2
  43. package/build/cjs/extensions/additional/YfmHtmlBlock/utils.js.map +1 -1
  44. package/build/cjs/extensions/behavior/Autocomplete/handler.d.ts +3 -1
  45. package/build/cjs/extensions/behavior/Autocomplete/handler.js +16 -10
  46. package/build/cjs/extensions/behavior/Autocomplete/handler.js.map +1 -1
  47. package/build/cjs/extensions/behavior/Autocomplete/index.js +1 -1
  48. package/build/cjs/extensions/behavior/Autocomplete/index.js.map +1 -1
  49. package/build/cjs/extensions/behavior/Clipboard/clipboard.d.ts +3 -1
  50. package/build/cjs/extensions/behavior/Clipboard/clipboard.js +31 -3
  51. package/build/cjs/extensions/behavior/Clipboard/clipboard.js.map +1 -1
  52. package/build/cjs/extensions/behavior/Clipboard/index.js +4 -0
  53. package/build/cjs/extensions/behavior/Clipboard/index.js.map +1 -1
  54. package/build/cjs/extensions/behavior/CommandMenu/handler.d.ts +3 -1
  55. package/build/cjs/extensions/behavior/CommandMenu/handler.js +6 -3
  56. package/build/cjs/extensions/behavior/CommandMenu/handler.js.map +1 -1
  57. package/build/cjs/extensions/behavior/CommandMenu/index.js +5 -3
  58. package/build/cjs/extensions/behavior/CommandMenu/index.js.map +1 -1
  59. package/build/cjs/extensions/behavior/EditorModeKeymap/index.js +13 -2
  60. package/build/cjs/extensions/behavior/EditorModeKeymap/index.js.map +1 -1
  61. package/build/cjs/extensions/behavior/FilePaste/index.d.ts +1 -1
  62. package/build/cjs/extensions/behavior/FilePaste/index.js +12 -0
  63. package/build/cjs/extensions/behavior/FilePaste/index.js.map +1 -1
  64. package/build/cjs/extensions/behavior/SelectionContext/index.js +3 -3
  65. package/build/cjs/extensions/behavior/SelectionContext/index.js.map +1 -1
  66. package/build/cjs/extensions/behavior/SelectionContext/tooltip.d.ts +3 -1
  67. package/build/cjs/extensions/behavior/SelectionContext/tooltip.js +7 -2
  68. package/build/cjs/extensions/behavior/SelectionContext/tooltip.js.map +1 -1
  69. package/build/cjs/extensions/behavior/utils/upload.d.ts +2 -0
  70. package/build/cjs/extensions/behavior/utils/upload.js +3 -0
  71. package/build/cjs/extensions/behavior/utils/upload.js.map +1 -1
  72. package/build/cjs/extensions/markdown/Breaks/index.js +2 -1
  73. package/build/cjs/extensions/markdown/Breaks/index.js.map +1 -1
  74. package/build/cjs/extensions/markdown/CodeBlock/CodeBlockHighlight/CodeBlockHighlight.js +2 -1
  75. package/build/cjs/extensions/markdown/CodeBlock/CodeBlockHighlight/CodeBlockHighlight.js.map +1 -1
  76. package/build/cjs/extensions/markdown/Deflist/DeflistSpecs/index.js +2 -2
  77. package/build/cjs/extensions/markdown/Deflist/DeflistSpecs/index.js.map +1 -1
  78. package/build/cjs/extensions/markdown/Html/index.js +2 -1
  79. package/build/cjs/extensions/markdown/Html/index.js.map +1 -1
  80. package/build/cjs/extensions/markdown/Html/schema.js +2 -2
  81. package/build/cjs/extensions/markdown/Html/schema.js.map +1 -1
  82. package/build/cjs/extensions/markdown/Link/paste-plugin.d.ts +1 -1
  83. package/build/cjs/extensions/markdown/Link/paste-plugin.js +11 -0
  84. package/build/cjs/extensions/markdown/Link/paste-plugin.js.map +1 -1
  85. package/build/cjs/extensions/markdown/Superscript/SuperscriptSpecs/index.js +3 -3
  86. package/build/cjs/extensions/markdown/Superscript/SuperscriptSpecs/index.js.map +1 -1
  87. package/build/cjs/extensions/yfm/Checkbox/CheckboxSpecs/index.js +2 -2
  88. package/build/cjs/extensions/yfm/Checkbox/CheckboxSpecs/index.js.map +1 -1
  89. package/build/cjs/extensions/yfm/Emoji/EmojiSpecs/EmojiSpecs.js +2 -2
  90. package/build/cjs/extensions/yfm/Emoji/EmojiSpecs/EmojiSpecs.js.map +1 -1
  91. package/build/cjs/extensions/yfm/ImgSize/ImagePaste/index.d.ts +1 -1
  92. package/build/cjs/extensions/yfm/ImgSize/ImagePaste/index.js +14 -0
  93. package/build/cjs/extensions/yfm/ImgSize/ImagePaste/index.js.map +1 -1
  94. package/build/cjs/extensions/yfm/ImgSize/ImagePaste/upload.js +6 -5
  95. package/build/cjs/extensions/yfm/ImgSize/ImagePaste/upload.js.map +1 -1
  96. package/build/cjs/extensions/yfm/ImgSize/ImgSizeSpecs/const.d.ts +1 -1
  97. package/build/cjs/extensions/yfm/ImgSize/ImgSizeSpecs/const.js +6 -6
  98. package/build/cjs/extensions/yfm/ImgSize/ImgSizeSpecs/const.js.map +1 -1
  99. package/build/cjs/extensions/yfm/ImgSize/ImgSizeSpecs/index.js +3 -3
  100. package/build/cjs/extensions/yfm/ImgSize/ImgSizeSpecs/index.js.map +1 -1
  101. package/build/cjs/extensions/yfm/ImgSize/utils.d.ts +2 -1
  102. package/build/cjs/extensions/yfm/ImgSize/utils.js +3 -2
  103. package/build/cjs/extensions/yfm/ImgSize/utils.js.map +1 -1
  104. package/build/cjs/extensions/yfm/Monospace/MonospaceSpecs/index.js +3 -3
  105. package/build/cjs/extensions/yfm/Monospace/MonospaceSpecs/index.js.map +1 -1
  106. package/build/cjs/extensions/yfm/Video/VideoSpecs/index.js +2 -2
  107. package/build/cjs/extensions/yfm/Video/VideoSpecs/index.js.map +1 -1
  108. package/build/cjs/extensions/yfm/Video/VideoSpecs/md-video.d.ts +4 -4
  109. package/build/cjs/extensions/yfm/Video/VideoSpecs/md-video.js +7 -7
  110. package/build/cjs/extensions/yfm/Video/VideoSpecs/md-video.js.map +1 -1
  111. package/build/cjs/extensions/yfm/YfmConfigs/index.d.ts +2 -2
  112. package/build/cjs/extensions/yfm/YfmConfigs/index.js +2 -2
  113. package/build/cjs/extensions/yfm/YfmConfigs/index.js.map +1 -1
  114. package/build/cjs/extensions/yfm/YfmFile/YfmFilePaste/index.d.ts +1 -1
  115. package/build/cjs/extensions/yfm/YfmFile/YfmFilePaste/index.js +15 -1
  116. package/build/cjs/extensions/yfm/YfmFile/YfmFilePaste/index.js.map +1 -1
  117. package/build/cjs/extensions/yfm/YfmNote/YfmNoteSpecs/index.js +3 -3
  118. package/build/cjs/extensions/yfm/YfmNote/YfmNoteSpecs/index.js.map +1 -1
  119. package/build/cjs/extensions/yfm/YfmTable/YfmTableSpecs/index.js +3 -3
  120. package/build/cjs/extensions/yfm/YfmTable/YfmTableSpecs/index.js.map +1 -1
  121. package/build/cjs/extensions/yfm/YfmTabs/actions.js +4 -4
  122. package/build/cjs/extensions/yfm/YfmTabs/actions.js.map +1 -1
  123. package/build/cjs/extensions/yfm/YfmTabs/plugins.js +11 -11
  124. package/build/cjs/extensions/yfm/YfmTabs/plugins.js.map +1 -1
  125. package/build/cjs/i18n/yfm-note/index.d.ts +1 -1
  126. package/build/cjs/logger.d.ts +75 -0
  127. package/build/cjs/logger.js +89 -1
  128. package/build/cjs/logger.js.map +1 -1
  129. package/build/cjs/markdown-it/emoji.d.ts +2 -2
  130. package/build/cjs/markdown-it/emoji.js +4 -4
  131. package/build/cjs/markdown-it/emoji.js.map +1 -1
  132. package/build/cjs/markup/codemirror/create.d.ts +2 -0
  133. package/build/cjs/markup/codemirror/create.js +15 -4
  134. package/build/cjs/markup/codemirror/create.js.map +1 -1
  135. package/build/cjs/markup/codemirror/files-upload-plugin/plugin.js +13 -0
  136. package/build/cjs/markup/codemirror/files-upload-plugin/plugin.js.map +1 -1
  137. package/build/cjs/markup/codemirror/logger-facet.d.ts +3 -0
  138. package/build/cjs/markup/codemirror/logger-facet.js +9 -0
  139. package/build/cjs/markup/codemirror/logger-facet.js.map +1 -0
  140. package/build/cjs/utils/event-emitter.d.ts +1 -0
  141. package/build/cjs/utils/event-emitter.js +3 -0
  142. package/build/cjs/utils/event-emitter.js.map +1 -1
  143. package/build/cjs/utils/facet.d.ts +1 -0
  144. package/build/cjs/utils/facet.js +33 -0
  145. package/build/cjs/utils/facet.js.map +1 -0
  146. package/build/cjs/utils/keymap.js +7 -2
  147. package/build/cjs/utils/keymap.js.map +1 -1
  148. package/build/cjs/version.js +1 -1
  149. package/build/cjs/version.js.map +1 -1
  150. package/build/esm/bundle/Editor.d.ts +3 -0
  151. package/build/esm/bundle/Editor.js +22 -3
  152. package/build/esm/bundle/Editor.js.map +1 -1
  153. package/build/esm/bundle/MarkdownEditorView.js +3 -2
  154. package/build/esm/bundle/MarkdownEditorView.js.map +1 -1
  155. package/build/esm/bundle/MarkupEditorView.js +7 -2
  156. package/build/esm/bundle/MarkupEditorView.js.map +1 -1
  157. package/build/esm/bundle/MarkupManager.d.ts +3 -6
  158. package/build/esm/bundle/MarkupManager.js +5 -5
  159. package/build/esm/bundle/MarkupManager.js.map +1 -1
  160. package/build/esm/bundle/WysiwygEditorView.js +7 -2
  161. package/build/esm/bundle/WysiwygEditorView.js.map +1 -1
  162. package/build/esm/bundle/types.d.ts +2 -0
  163. package/build/esm/bundle/types.js.map +1 -1
  164. package/build/esm/bundle/useMarkdownEditor.js +5 -3
  165. package/build/esm/bundle/useMarkdownEditor.js.map +1 -1
  166. package/build/esm/core/Editor.d.ts +3 -1
  167. package/build/esm/core/Editor.js +6 -3
  168. package/build/esm/core/Editor.js.map +1 -1
  169. package/build/esm/core/ExtensionBuilder.d.ts +3 -1
  170. package/build/esm/core/ExtensionBuilder.js +6 -1
  171. package/build/esm/core/ExtensionBuilder.js.map +1 -1
  172. package/build/esm/core/ExtensionsManager.d.ts +4 -2
  173. package/build/esm/core/ExtensionsManager.js +6 -5
  174. package/build/esm/core/ExtensionsManager.js.map +1 -1
  175. package/build/esm/core/ParserTokensRegistry.d.ts +6 -0
  176. package/build/esm/core/ParserTokensRegistry.js +9 -1
  177. package/build/esm/core/ParserTokensRegistry.js.map +1 -1
  178. package/build/esm/core/index.d.ts +1 -0
  179. package/build/esm/core/index.js +1 -0
  180. package/build/esm/core/index.js.map +1 -1
  181. package/build/esm/core/markdown/MarkdownParser.d.ts +9 -1
  182. package/build/esm/core/markdown/MarkdownParser.js +7 -3
  183. package/build/esm/core/markdown/MarkdownParser.js.map +1 -1
  184. package/build/esm/core/utils/logger.d.ts +3 -0
  185. package/build/esm/core/utils/logger.js +8 -0
  186. package/build/esm/core/utils/logger.js.map +1 -0
  187. package/build/esm/core/utils/metrics.d.ts +2 -1
  188. package/build/esm/core/utils/metrics.js +8 -2
  189. package/build/esm/core/utils/metrics.js.map +1 -1
  190. package/build/esm/extensions/additional/YfmHtmlBlock/utils.d.ts +1 -1
  191. package/build/esm/extensions/additional/YfmHtmlBlock/utils.js +1 -1
  192. package/build/esm/extensions/additional/YfmHtmlBlock/utils.js.map +1 -1
  193. package/build/esm/extensions/behavior/Autocomplete/handler.d.ts +3 -1
  194. package/build/esm/extensions/behavior/Autocomplete/handler.js +15 -9
  195. package/build/esm/extensions/behavior/Autocomplete/handler.js.map +1 -1
  196. package/build/esm/extensions/behavior/Autocomplete/index.js +1 -1
  197. package/build/esm/extensions/behavior/Autocomplete/index.js.map +1 -1
  198. package/build/esm/extensions/behavior/Clipboard/clipboard.d.ts +3 -1
  199. package/build/esm/extensions/behavior/Clipboard/clipboard.js +32 -4
  200. package/build/esm/extensions/behavior/Clipboard/clipboard.js.map +1 -1
  201. package/build/esm/extensions/behavior/Clipboard/index.js +4 -0
  202. package/build/esm/extensions/behavior/Clipboard/index.js.map +1 -1
  203. package/build/esm/extensions/behavior/CommandMenu/handler.d.ts +3 -1
  204. package/build/esm/extensions/behavior/CommandMenu/handler.js +7 -4
  205. package/build/esm/extensions/behavior/CommandMenu/handler.js.map +1 -1
  206. package/build/esm/extensions/behavior/CommandMenu/index.js +6 -4
  207. package/build/esm/extensions/behavior/CommandMenu/index.js.map +1 -1
  208. package/build/esm/extensions/behavior/EditorModeKeymap/index.js +13 -2
  209. package/build/esm/extensions/behavior/EditorModeKeymap/index.js.map +1 -1
  210. package/build/esm/extensions/behavior/FilePaste/index.d.ts +1 -1
  211. package/build/esm/extensions/behavior/FilePaste/index.js +12 -0
  212. package/build/esm/extensions/behavior/FilePaste/index.js.map +1 -1
  213. package/build/esm/extensions/behavior/SelectionContext/index.js +3 -3
  214. package/build/esm/extensions/behavior/SelectionContext/index.js.map +1 -1
  215. package/build/esm/extensions/behavior/SelectionContext/tooltip.d.ts +3 -1
  216. package/build/esm/extensions/behavior/SelectionContext/tooltip.js +8 -3
  217. package/build/esm/extensions/behavior/SelectionContext/tooltip.js.map +1 -1
  218. package/build/esm/extensions/behavior/utils/upload.d.ts +2 -0
  219. package/build/esm/extensions/behavior/utils/upload.js +3 -0
  220. package/build/esm/extensions/behavior/utils/upload.js.map +1 -1
  221. package/build/esm/extensions/markdown/Breaks/index.js +3 -2
  222. package/build/esm/extensions/markdown/Breaks/index.js.map +1 -1
  223. package/build/esm/extensions/markdown/CodeBlock/CodeBlockHighlight/CodeBlockHighlight.js +3 -2
  224. package/build/esm/extensions/markdown/CodeBlock/CodeBlockHighlight/CodeBlockHighlight.js.map +1 -1
  225. package/build/esm/extensions/markdown/Deflist/DeflistSpecs/index.js +1 -1
  226. package/build/esm/extensions/markdown/Deflist/DeflistSpecs/index.js.map +1 -1
  227. package/build/esm/extensions/markdown/Html/index.js +3 -2
  228. package/build/esm/extensions/markdown/Html/index.js.map +1 -1
  229. package/build/esm/extensions/markdown/Html/schema.js +1 -1
  230. package/build/esm/extensions/markdown/Html/schema.js.map +1 -1
  231. package/build/esm/extensions/markdown/Link/paste-plugin.d.ts +1 -1
  232. package/build/esm/extensions/markdown/Link/paste-plugin.js +11 -0
  233. package/build/esm/extensions/markdown/Link/paste-plugin.js.map +1 -1
  234. package/build/esm/extensions/markdown/Superscript/SuperscriptSpecs/index.js +2 -2
  235. package/build/esm/extensions/markdown/Superscript/SuperscriptSpecs/index.js.map +1 -1
  236. package/build/esm/extensions/yfm/Checkbox/CheckboxSpecs/index.js +1 -1
  237. package/build/esm/extensions/yfm/Checkbox/CheckboxSpecs/index.js.map +1 -1
  238. package/build/esm/extensions/yfm/Emoji/EmojiSpecs/EmojiSpecs.js +1 -1
  239. package/build/esm/extensions/yfm/Emoji/EmojiSpecs/EmojiSpecs.js.map +1 -1
  240. package/build/esm/extensions/yfm/ImgSize/ImagePaste/index.d.ts +1 -1
  241. package/build/esm/extensions/yfm/ImgSize/ImagePaste/index.js +14 -0
  242. package/build/esm/extensions/yfm/ImgSize/ImagePaste/index.js.map +1 -1
  243. package/build/esm/extensions/yfm/ImgSize/ImagePaste/upload.js +7 -6
  244. package/build/esm/extensions/yfm/ImgSize/ImagePaste/upload.js.map +1 -1
  245. package/build/esm/extensions/yfm/ImgSize/ImgSizeSpecs/const.d.ts +1 -1
  246. package/build/esm/extensions/yfm/ImgSize/ImgSizeSpecs/const.js +1 -1
  247. package/build/esm/extensions/yfm/ImgSize/ImgSizeSpecs/const.js.map +1 -1
  248. package/build/esm/extensions/yfm/ImgSize/ImgSizeSpecs/index.js +2 -2
  249. package/build/esm/extensions/yfm/ImgSize/ImgSizeSpecs/index.js.map +1 -1
  250. package/build/esm/extensions/yfm/ImgSize/utils.d.ts +2 -1
  251. package/build/esm/extensions/yfm/ImgSize/utils.js +4 -3
  252. package/build/esm/extensions/yfm/ImgSize/utils.js.map +1 -1
  253. package/build/esm/extensions/yfm/Monospace/MonospaceSpecs/index.js +2 -2
  254. package/build/esm/extensions/yfm/Monospace/MonospaceSpecs/index.js.map +1 -1
  255. package/build/esm/extensions/yfm/Video/VideoSpecs/index.js +1 -1
  256. package/build/esm/extensions/yfm/Video/VideoSpecs/index.js.map +1 -1
  257. package/build/esm/extensions/yfm/Video/VideoSpecs/md-video.d.ts +4 -4
  258. package/build/esm/extensions/yfm/Video/VideoSpecs/md-video.js +3 -3
  259. package/build/esm/extensions/yfm/Video/VideoSpecs/md-video.js.map +1 -1
  260. package/build/esm/extensions/yfm/YfmConfigs/index.d.ts +2 -2
  261. package/build/esm/extensions/yfm/YfmConfigs/index.js +2 -2
  262. package/build/esm/extensions/yfm/YfmConfigs/index.js.map +1 -1
  263. package/build/esm/extensions/yfm/YfmFile/YfmFilePaste/index.d.ts +1 -1
  264. package/build/esm/extensions/yfm/YfmFile/YfmFilePaste/index.js +15 -1
  265. package/build/esm/extensions/yfm/YfmFile/YfmFilePaste/index.js.map +1 -1
  266. package/build/esm/extensions/yfm/YfmNote/YfmNoteSpecs/index.js +2 -2
  267. package/build/esm/extensions/yfm/YfmNote/YfmNoteSpecs/index.js.map +1 -1
  268. package/build/esm/extensions/yfm/YfmTable/YfmTableSpecs/index.js +2 -2
  269. package/build/esm/extensions/yfm/YfmTable/YfmTableSpecs/index.js.map +1 -1
  270. package/build/esm/extensions/yfm/YfmTabs/actions.js +1 -1
  271. package/build/esm/extensions/yfm/YfmTabs/actions.js.map +1 -1
  272. package/build/esm/extensions/yfm/YfmTabs/plugins.js +1 -1
  273. package/build/esm/extensions/yfm/YfmTabs/plugins.js.map +1 -1
  274. package/build/esm/i18n/yfm-note/index.d.ts +1 -1
  275. package/build/esm/logger.d.ts +75 -0
  276. package/build/esm/logger.js +87 -0
  277. package/build/esm/logger.js.map +1 -1
  278. package/build/esm/markdown-it/emoji.d.ts +2 -2
  279. package/build/esm/markdown-it/emoji.js +2 -2
  280. package/build/esm/markdown-it/emoji.js.map +1 -1
  281. package/build/esm/markup/codemirror/create.d.ts +2 -0
  282. package/build/esm/markup/codemirror/create.js +16 -5
  283. package/build/esm/markup/codemirror/create.js.map +1 -1
  284. package/build/esm/markup/codemirror/files-upload-plugin/plugin.js +13 -0
  285. package/build/esm/markup/codemirror/files-upload-plugin/plugin.js.map +1 -1
  286. package/build/esm/markup/codemirror/logger-facet.d.ts +3 -0
  287. package/build/esm/markup/codemirror/logger-facet.js +6 -0
  288. package/build/esm/markup/codemirror/logger-facet.js.map +1 -0
  289. package/build/esm/utils/event-emitter.d.ts +1 -0
  290. package/build/esm/utils/event-emitter.js +3 -0
  291. package/build/esm/utils/event-emitter.js.map +1 -1
  292. package/build/esm/utils/facet.d.ts +1 -0
  293. package/build/esm/utils/facet.js +29 -0
  294. package/build/esm/utils/facet.js.map +1 -0
  295. package/build/esm/utils/keymap.js +7 -2
  296. package/build/esm/utils/keymap.js.map +1 -1
  297. package/build/esm/version.js +1 -1
  298. package/build/esm/version.js.map +1 -1
  299. package/package.json +1 -1
@@ -1 +1 @@
1
- {"version":3,"file":"clipboard.js","sourceRoot":"../../../../../src","sources":["extensions/behavior/Clipboard/clipboard.ts"],"names":[],"mappings":"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","sourcesContent":["import {Fragment, type Node, type ResolvedPos, type Schema, Slice} from 'prosemirror-model';\nimport {type EditorState, Plugin, type Selection} from 'prosemirror-state';\nimport type {EditorView} from 'prosemirror-view';\n\nimport {type Parser, type Serializer, trackTransactionMetrics} from '../../../core';\nimport {logger} from '../../../logger';\nimport '../../../types/spec';\nimport {tryCatch} from '../../../utils/helpers';\nimport {isNodeSelection, isTextSelection, isWholeSelection} from '../../../utils/selection';\nimport {serializeForClipboard} from '../../../utils/serialize-for-clipboard';\nimport {BaseNode, pType} from '../../base/BaseSchema';\n\nimport {isInsideCode} from './code';\nimport {DataTransferType, extractTextContentFromHtml, isIosSafariShare} from './utils';\n\nexport type ClipboardPluginOptions = {\n mdParser: Parser;\n textParser: Parser;\n serializer: Serializer;\n pasteFileHandler?: (file: File) => void;\n};\n\nexport const clipboard = ({\n textParser,\n mdParser,\n serializer,\n pasteFileHandler,\n}: ClipboardPluginOptions) => {\n return new Plugin({\n props: {\n handleDOMEvents: {\n copy(view, e) {\n if (!e.clipboardData) return false;\n const result = serializeSelected(view, serializer);\n if (result) {\n e.preventDefault();\n setClipboardData(e.clipboardData, result);\n return true;\n }\n return false;\n },\n cut(view, e) {\n if (!e.clipboardData) return false;\n const result = serializeSelected(view, serializer);\n if (result) {\n e.preventDefault();\n setClipboardData(e.clipboardData, result);\n view.dispatch(\n view.state.tr\n .deleteSelection()\n .scrollIntoView()\n .setMeta('uiEvent', 'cut'),\n );\n return true;\n }\n return false;\n },\n paste(view, e) {\n if (!e.clipboardData) return false;\n\n let data: string;\n let isPasteHandled = false;\n\n if (\n isIosSafariShare(e.clipboardData) &&\n (data = e.clipboardData.getData(DataTransferType.UriList))\n ) {\n const schema: Schema = view.state.schema;\n view.dispatch(\n trackTransactionMetrics(\n view.state.tr.replaceSelection(\n // paste link inline\n new Slice(\n Fragment.from(\n pType(schema).create(null, schema.text(data)),\n ),\n 1,\n 1,\n ),\n ),\n 'paste',\n {clipboardDataFormat: DataTransferType.UriList},\n ),\n );\n isPasteHandled = true;\n e.preventDefault();\n return true;\n }\n\n if (\n !e.clipboardData.types.includes(DataTransferType.Yfm) &&\n (data = e.clipboardData.getData(DataTransferType.Html))\n ) {\n const textFromHtml = extractTextContentFromHtml(data);\n if (textFromHtml) {\n const res = tryCatch(() => textParser.parse(textFromHtml));\n if (res.success) {\n const docNode = res.result;\n const slice = getSliceFromMarkupFragment(docNode.content);\n view.dispatch(\n trackTransactionMetrics(\n view.state.tr.replaceSelection(slice),\n 'paste',\n {clipboardDataFormat: DataTransferType.Html},\n ),\n );\n isPasteHandled = true;\n } else {\n logger.error(res.error);\n console.error(res.error);\n }\n } else return false; // default html pasting\n }\n\n if (\n !isPasteHandled &&\n ((data = e.clipboardData.getData(DataTransferType.Yfm)) ||\n (data = e.clipboardData.getData(DataTransferType.Text)))\n ) {\n let parser: Parser;\n let dataFormat: string;\n if (e.clipboardData.types.includes(DataTransferType.Yfm)) {\n parser = mdParser;\n dataFormat = DataTransferType.Yfm;\n } else {\n parser = textParser;\n dataFormat = DataTransferType.Text;\n }\n const codeType = isInsideCode(view.state);\n if (codeType) {\n const schema: Schema = view.state.schema;\n const insideCodeData = e.clipboardData.getData(DataTransferType.Text);\n\n view.dispatch(\n trackTransactionMetrics(\n view.state.tr.replaceSelectionWith(\n schema.text(\n codeType === 'inline'\n ? insideCodeData.trim()\n : insideCodeData,\n ),\n ),\n 'paste',\n {clipboardDataFormat: DataTransferType.Text, code: codeType},\n ),\n );\n isPasteHandled = true;\n } else {\n const res = tryCatch(() => parser.parse(data));\n if (res.success) {\n const docNode = res.result;\n const slice = getSliceFromMarkupFragment(docNode.content);\n view.dispatch(\n trackTransactionMetrics(\n view.state.tr.replaceSelection(slice),\n 'paste',\n {clipboardDataFormat: dataFormat},\n ),\n );\n isPasteHandled = true;\n } else {\n logger.error(res.error);\n console.error(res.error);\n }\n }\n }\n\n if (e.clipboardData.files.length && pasteFileHandler) {\n for (const file of Array.from(e.clipboardData.files)) {\n pasteFileHandler(file);\n }\n isPasteHandled = true;\n }\n\n if (isPasteHandled) {\n e.preventDefault();\n return true;\n }\n\n return false;\n },\n },\n },\n });\n};\n\nfunction getSliceFromMarkupFragment(fragment: Fragment) {\n let start = 0;\n let end = 0;\n if (fragment.firstChild?.isTextblock) {\n start = 1;\n if (fragment.childCount === 1) {\n end = 1;\n }\n }\n return new Slice(fragment, start, end);\n}\n\ntype SerializeResult = {\n text: string;\n html?: string;\n markup?: string;\n};\nfunction serializeSelected(view: EditorView, serializer: Serializer): SerializeResult | null {\n const sel = view.state.selection;\n\n if (sel.empty) return null;\n\n if (getSharedDepthNode(sel).type.spec.code) {\n const fragment = sel.content().content;\n return {text: fragment.textBetween(0, fragment.size)};\n }\n\n // FIXME: Verify and use Node instead of Fragment\n const markup = serializer.serialize(getCopyContent(view.state).content as any);\n const {dom, text} = serializeForClipboard(view, sel.content());\n return {markup, text, html: dom.innerHTML};\n}\n\nfunction setClipboardData(data: DataTransfer, result: SerializeResult) {\n data.clearData();\n if (typeof result.markup === 'string') data.setData(DataTransferType.Yfm, result.markup);\n if (typeof result.html === 'string') data.setData(DataTransferType.Html, result.html);\n data.setData(DataTransferType.Text, result.text);\n}\n\nfunction getCopyContent(state: EditorState): Slice {\n const sel = state.selection;\n\n if (isWholeSelection(sel)) {\n return new Slice(state.doc.content, 0, 0);\n }\n\n if (isTextSelectionWithinSameTextBlock(sel)) {\n return new Slice(createFragmentFromInlineSelection(state), 0, 0);\n }\n\n if (isNodeSelection(sel)) {\n const {node} = sel;\n if (node.type.spec.complex) {\n if (node.isTextblock) {\n return new Slice(\n Fragment.from(state.schema.node(BaseNode.Paragraph, {}, node.content)),\n 1,\n 1,\n );\n } else {\n const {complex} = node.type.spec;\n if (complex === 'root') {\n return new Slice(Fragment.from(node), 1, 1);\n } else if (complex === 'leaf') {\n return new Slice(Fragment.from(node.content), 1, 1);\n } else {\n // TODO: handle copy of intermediate complex block node\n }\n }\n } else {\n return new Slice(Fragment.from(node), 1, 1);\n }\n }\n\n let slice = getSelectionContent(sel);\n\n // replace first node with paragraph if needed\n if (\n slice.content.firstChild?.isTextblock &&\n slice.content.firstChild.type.name !== BaseNode.Paragraph\n ) {\n let shouldTransformFirstChildToPara = true;\n const {firstChild} = slice.content;\n\n // if all text selected inside first node, don't replace it with paragraph\n if (firstChild.eq(sel.$from.parent)) {\n shouldTransformFirstChildToPara = false;\n }\n\n if (shouldTransformFirstChildToPara) {\n slice = new Slice(\n slice.content.replaceChild(\n 0,\n state.schema.node(BaseNode.Paragraph, {}, firstChild.content),\n ),\n slice.openStart,\n slice.openStart,\n );\n }\n }\n\n return slice;\n}\n\nfunction isTextSelectionWithinSameTextBlock(sel: Selection) {\n return isTextSelection(sel) && sel.$from.sameParent(sel.$to) && sel.$from.parent.isTextblock;\n}\n\nfunction createFragmentFromInlineSelection(state: EditorState) {\n const sel = state.selection;\n const inlineSlice = state.doc.slice(sel.from, sel.to);\n const isComplexTextblock = Boolean(sel.$from.parent.type.spec.complex);\n const isAllContentSelected = sel.$from.parent.content.eq(inlineSlice.content);\n if (isComplexTextblock || !isAllContentSelected) {\n // copy selected inline content to paragraph if current node is complex\n // or if only part of it's content was selected\n return Fragment.from(state.schema.node(BaseNode.Paragraph, {}, inlineSlice.content));\n }\n return Fragment.from(sel.$from.parent.copy(inlineSlice.content));\n}\n\n/**\n * Like `selection.content()`, but smarter.\n * Copy a structure of complex nodes,\n * e.g. if select part of cut title it creates slice with yfm-cut –> yfm-cut-title -> selected text\n * it works well with simple nodes, but to handle cases as described above, custom logic needed\n */\nfunction getSelectionContent(sel: Selection) {\n const sharedNodeType = getSharedDepthNode(sel).type;\n const sharedNodeComplex = sharedNodeType.spec.complex;\n const includeParents = sharedNodeComplex && sharedNodeComplex !== 'leaf';\n return sel.$from.doc.slice(sel.$from.pos, sel.to, includeParents);\n}\n\nfunction getSharedDepthNode({$from, $to}: {$from: ResolvedPos; $to: ResolvedPos}): Node {\n return $from.node($from.sharedDepth($to.pos));\n}\n"]}
1
+ {"version":3,"file":"clipboard.js","sourceRoot":"../../../../../src","sources":["extensions/behavior/Clipboard/clipboard.ts"],"names":[],"mappings":"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","sourcesContent":["import {Fragment, type Node, type ResolvedPos, type Schema, Slice} from 'prosemirror-model';\nimport {type EditorState, Plugin, type Selection} from 'prosemirror-state';\nimport type {EditorView} from 'prosemirror-view';\n\nimport {type Parser, type Serializer, trackTransactionMetrics} from '../../../core';\nimport {type Logger2, globalLogger} from '../../../logger';\nimport '../../../types/spec';\nimport {tryCatch} from '../../../utils/helpers';\nimport {isNodeSelection, isTextSelection, isWholeSelection} from '../../../utils/selection';\nimport {serializeForClipboard} from '../../../utils/serialize-for-clipboard';\nimport {BaseNode, pType} from '../../base/BaseSchema';\n\nimport {isInsideCode} from './code';\nimport {DataTransferType, extractTextContentFromHtml, isIosSafariShare} from './utils';\n\nexport type ClipboardPluginOptions = {\n logger: Logger2.ILogger;\n mdParser: Parser;\n textParser: Parser;\n serializer: Serializer;\n pasteFileHandler?: (file: File) => void;\n};\n\nexport const clipboard = ({\n logger,\n textParser,\n mdParser,\n serializer,\n pasteFileHandler,\n}: ClipboardPluginOptions) => {\n return new Plugin({\n props: {\n handleDOMEvents: {\n copy(view, e) {\n if (!e.clipboardData) return false;\n const result = serializeSelected(view, serializer);\n if (result) {\n e.preventDefault();\n setClipboardData(e.clipboardData, result);\n return true;\n }\n return false;\n },\n cut(view, e) {\n if (!e.clipboardData) return false;\n const result = serializeSelected(view, serializer);\n if (result) {\n e.preventDefault();\n setClipboardData(e.clipboardData, result);\n view.dispatch(\n view.state.tr\n .deleteSelection()\n .scrollIntoView()\n .setMeta('uiEvent', 'cut'),\n );\n return true;\n }\n return false;\n },\n paste(view, e) {\n if (!e.clipboardData) return false;\n\n const pasteLogger = logger.nested({\n domEvent: 'paste',\n dataTypes: e.clipboardData.types,\n });\n\n let data: string;\n let isPasteHandled = false;\n\n if (\n isIosSafariShare(e.clipboardData) &&\n (data = e.clipboardData.getData(DataTransferType.UriList))\n ) {\n const schema: Schema = view.state.schema;\n view.dispatch(\n trackTransactionMetrics(\n view.state.tr.replaceSelection(\n // paste link inline\n new Slice(\n Fragment.from(\n pType(schema).create(null, schema.text(data)),\n ),\n 1,\n 1,\n ),\n ),\n 'paste',\n {clipboardDataFormat: DataTransferType.UriList},\n ),\n );\n pasteLogger.event({\n event: 'paste-uri-list',\n });\n isPasteHandled = true;\n e.preventDefault();\n return true;\n }\n\n if (\n !e.clipboardData.types.includes(DataTransferType.Yfm) &&\n (data = e.clipboardData.getData(DataTransferType.Html))\n ) {\n const textFromHtml = extractTextContentFromHtml(data);\n if (textFromHtml) {\n const res = tryCatch(() => textParser.parse(textFromHtml));\n if (res.success) {\n const docNode = res.result;\n const slice = getSliceFromMarkupFragment(docNode.content);\n view.dispatch(\n trackTransactionMetrics(\n view.state.tr.replaceSelection(slice),\n 'paste',\n {clipboardDataFormat: DataTransferType.Html},\n ),\n );\n pasteLogger.event({\n event: 'paste-parsed-html',\n });\n isPasteHandled = true;\n } else {\n globalLogger.error(res.error);\n pasteLogger.error(res.error, {\n event: 'parse-html',\n });\n console.error(res.error);\n }\n } else return false; // default html pasting\n }\n\n if (\n !isPasteHandled &&\n ((data = e.clipboardData.getData(DataTransferType.Yfm)) ||\n (data = e.clipboardData.getData(DataTransferType.Text)))\n ) {\n let parser: Parser;\n let dataFormat: string;\n if (e.clipboardData.types.includes(DataTransferType.Yfm)) {\n parser = mdParser;\n dataFormat = DataTransferType.Yfm;\n } else {\n parser = textParser;\n dataFormat = DataTransferType.Text;\n }\n const codeType = isInsideCode(view.state);\n if (codeType) {\n const schema: Schema = view.state.schema;\n const insideCodeData = e.clipboardData.getData(DataTransferType.Text);\n\n pasteLogger.event({\n event: 'paste-text-to-code',\n codeType,\n });\n view.dispatch(\n trackTransactionMetrics(\n view.state.tr.replaceSelectionWith(\n schema.text(\n codeType === 'inline'\n ? insideCodeData.trim()\n : insideCodeData,\n ),\n ),\n 'paste',\n {clipboardDataFormat: DataTransferType.Text, code: codeType},\n ),\n );\n isPasteHandled = true;\n } else {\n const res = tryCatch(() => parser.parse(data));\n if (res.success) {\n const docNode = res.result;\n const slice = getSliceFromMarkupFragment(docNode.content);\n pasteLogger.event({\n event: 'paste-parsed-content',\n dataFormat,\n });\n view.dispatch(\n trackTransactionMetrics(\n view.state.tr.replaceSelection(slice),\n 'paste',\n {clipboardDataFormat: dataFormat},\n ),\n );\n isPasteHandled = true;\n } else {\n globalLogger.error(res.error);\n pasteLogger.error(res.error, {\n event: 'paste',\n dataFormat,\n });\n console.error(res.error);\n }\n }\n }\n\n if (e.clipboardData.files.length && pasteFileHandler) {\n pasteLogger.event({\n event: 'paste-files',\n });\n for (const file of Array.from(e.clipboardData.files)) {\n pasteFileHandler(file);\n }\n isPasteHandled = true;\n }\n\n if (isPasteHandled) {\n e.preventDefault();\n return true;\n }\n\n return false;\n },\n },\n },\n });\n};\n\nfunction getSliceFromMarkupFragment(fragment: Fragment) {\n let start = 0;\n let end = 0;\n if (fragment.firstChild?.isTextblock) {\n start = 1;\n if (fragment.childCount === 1) {\n end = 1;\n }\n }\n return new Slice(fragment, start, end);\n}\n\ntype SerializeResult = {\n text: string;\n html?: string;\n markup?: string;\n};\nfunction serializeSelected(view: EditorView, serializer: Serializer): SerializeResult | null {\n const sel = view.state.selection;\n\n if (sel.empty) return null;\n\n if (getSharedDepthNode(sel).type.spec.code) {\n const fragment = sel.content().content;\n return {text: fragment.textBetween(0, fragment.size)};\n }\n\n // FIXME: Verify and use Node instead of Fragment\n const markup = serializer.serialize(getCopyContent(view.state).content as any);\n const {dom, text} = serializeForClipboard(view, sel.content());\n return {markup, text, html: dom.innerHTML};\n}\n\nfunction setClipboardData(data: DataTransfer, result: SerializeResult) {\n data.clearData();\n if (typeof result.markup === 'string') data.setData(DataTransferType.Yfm, result.markup);\n if (typeof result.html === 'string') data.setData(DataTransferType.Html, result.html);\n data.setData(DataTransferType.Text, result.text);\n}\n\nfunction getCopyContent(state: EditorState): Slice {\n const sel = state.selection;\n\n if (isWholeSelection(sel)) {\n return new Slice(state.doc.content, 0, 0);\n }\n\n if (isTextSelectionWithinSameTextBlock(sel)) {\n return new Slice(createFragmentFromInlineSelection(state), 0, 0);\n }\n\n if (isNodeSelection(sel)) {\n const {node} = sel;\n if (node.type.spec.complex) {\n if (node.isTextblock) {\n return new Slice(\n Fragment.from(state.schema.node(BaseNode.Paragraph, {}, node.content)),\n 1,\n 1,\n );\n } else {\n const {complex} = node.type.spec;\n if (complex === 'root') {\n return new Slice(Fragment.from(node), 1, 1);\n } else if (complex === 'leaf') {\n return new Slice(Fragment.from(node.content), 1, 1);\n } else {\n // TODO: handle copy of intermediate complex block node\n }\n }\n } else {\n return new Slice(Fragment.from(node), 1, 1);\n }\n }\n\n let slice = getSelectionContent(sel);\n\n // replace first node with paragraph if needed\n if (\n slice.content.firstChild?.isTextblock &&\n slice.content.firstChild.type.name !== BaseNode.Paragraph\n ) {\n let shouldTransformFirstChildToPara = true;\n const {firstChild} = slice.content;\n\n // if all text selected inside first node, don't replace it with paragraph\n if (firstChild.eq(sel.$from.parent)) {\n shouldTransformFirstChildToPara = false;\n }\n\n if (shouldTransformFirstChildToPara) {\n slice = new Slice(\n slice.content.replaceChild(\n 0,\n state.schema.node(BaseNode.Paragraph, {}, firstChild.content),\n ),\n slice.openStart,\n slice.openStart,\n );\n }\n }\n\n return slice;\n}\n\nfunction isTextSelectionWithinSameTextBlock(sel: Selection) {\n return isTextSelection(sel) && sel.$from.sameParent(sel.$to) && sel.$from.parent.isTextblock;\n}\n\nfunction createFragmentFromInlineSelection(state: EditorState) {\n const sel = state.selection;\n const inlineSlice = state.doc.slice(sel.from, sel.to);\n const isComplexTextblock = Boolean(sel.$from.parent.type.spec.complex);\n const isAllContentSelected = sel.$from.parent.content.eq(inlineSlice.content);\n if (isComplexTextblock || !isAllContentSelected) {\n // copy selected inline content to paragraph if current node is complex\n // or if only part of it's content was selected\n return Fragment.from(state.schema.node(BaseNode.Paragraph, {}, inlineSlice.content));\n }\n return Fragment.from(sel.$from.parent.copy(inlineSlice.content));\n}\n\n/**\n * Like `selection.content()`, but smarter.\n * Copy a structure of complex nodes,\n * e.g. if select part of cut title it creates slice with yfm-cut –> yfm-cut-title -> selected text\n * it works well with simple nodes, but to handle cases as described above, custom logic needed\n */\nfunction getSelectionContent(sel: Selection) {\n const sharedNodeType = getSharedDepthNode(sel).type;\n const sharedNodeComplex = sharedNodeType.spec.complex;\n const includeParents = sharedNodeComplex && sharedNodeComplex !== 'leaf';\n return sel.$from.doc.slice(sel.$from.pos, sel.to, includeParents);\n}\n\nfunction getSharedDepthNode({$from, $to}: {$from: ResolvedPos; $to: ResolvedPos}): Node {\n return $from.node($from.sharedDepth($to.pos));\n}\n"]}
@@ -3,6 +3,10 @@ import * as clipboardUtils from "./utils.js";
3
3
  export { clipboardUtils };
4
4
  export const Clipboard = (builder, opts) => {
5
5
  builder.addPlugin((deps) => clipboard({
6
+ logger: builder.logger.nested({
7
+ module: 'clipboard',
8
+ plugin: 'clipboard',
9
+ }),
6
10
  mdParser: deps.markupParser,
7
11
  textParser: deps.textParser,
8
12
  serializer: deps.serializer,
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"../../../../../src","sources":["extensions/behavior/Clipboard/index.ts"],"names":[],"mappings":"AAEA,OAAO,EAA8B,SAAS,EAAC,uBAAoB;AACnE,OAAO,KAAK,cAAc,mBAAgB;AAE1C,OAAO,EAAC,cAAc,EAAC,CAAC;AAIxB,MAAM,CAAC,MAAM,SAAS,GAAoC,CAAC,OAAO,EAAE,IAAI,EAAE,EAAE;IACxE,OAAO,CAAC,SAAS,CACb,CAAC,IAAI,EAAE,EAAE,CACL,SAAS,CAAC;QACN,QAAQ,EAAE,IAAI,CAAC,YAAY;QAC3B,UAAU,EAAE,IAAI,CAAC,UAAU;QAC3B,UAAU,EAAE,IAAI,CAAC,UAAU;QAC3B,gBAAgB,EAAE,IAAI,CAAC,gBAAgB;KAC1C,CAAC,EACN,OAAO,CAAC,QAAQ,CAAC,OAAO,CAC3B,CAAC;AACN,CAAC,CAAC","sourcesContent":["import type {ExtensionAuto} from '../../../core';\n\nimport {type ClipboardPluginOptions, clipboard} from './clipboard';\nimport * as clipboardUtils from './utils';\n\nexport {clipboardUtils};\n\nexport type ClipboardOptions = Pick<ClipboardPluginOptions, 'pasteFileHandler'>;\n\nexport const Clipboard: ExtensionAuto<ClipboardOptions> = (builder, opts) => {\n builder.addPlugin(\n (deps) =>\n clipboard({\n mdParser: deps.markupParser,\n textParser: deps.textParser,\n serializer: deps.serializer,\n pasteFileHandler: opts.pasteFileHandler,\n }),\n builder.Priority.VeryLow,\n );\n};\n"]}
1
+ {"version":3,"file":"index.js","sourceRoot":"../../../../../src","sources":["extensions/behavior/Clipboard/index.ts"],"names":[],"mappings":"AAEA,OAAO,EAA8B,SAAS,EAAC,uBAAoB;AACnE,OAAO,KAAK,cAAc,mBAAgB;AAE1C,OAAO,EAAC,cAAc,EAAC,CAAC;AAIxB,MAAM,CAAC,MAAM,SAAS,GAAoC,CAAC,OAAO,EAAE,IAAI,EAAE,EAAE;IACxE,OAAO,CAAC,SAAS,CACb,CAAC,IAAI,EAAE,EAAE,CACL,SAAS,CAAC;QACN,MAAM,EAAE,OAAO,CAAC,MAAM,CAAC,MAAM,CAAC;YAC1B,MAAM,EAAE,WAAW;YACnB,MAAM,EAAE,WAAW;SACtB,CAAC;QACF,QAAQ,EAAE,IAAI,CAAC,YAAY;QAC3B,UAAU,EAAE,IAAI,CAAC,UAAU;QAC3B,UAAU,EAAE,IAAI,CAAC,UAAU;QAC3B,gBAAgB,EAAE,IAAI,CAAC,gBAAgB;KAC1C,CAAC,EACN,OAAO,CAAC,QAAQ,CAAC,OAAO,CAC3B,CAAC;AACN,CAAC,CAAC","sourcesContent":["import type {ExtensionAuto} from '../../../core';\n\nimport {type ClipboardPluginOptions, clipboard} from './clipboard';\nimport * as clipboardUtils from './utils';\n\nexport {clipboardUtils};\n\nexport type ClipboardOptions = Pick<ClipboardPluginOptions, 'pasteFileHandler'>;\n\nexport const Clipboard: ExtensionAuto<ClipboardOptions> = (builder, opts) => {\n builder.addPlugin(\n (deps) =>\n clipboard({\n logger: builder.logger.nested({\n module: 'clipboard',\n plugin: 'clipboard',\n }),\n mdParser: deps.markupParser,\n textParser: deps.textParser,\n serializer: deps.serializer,\n pasteFileHandler: opts.pasteFileHandler,\n }),\n builder.Priority.VeryLow,\n );\n};\n"]}
@@ -1,4 +1,5 @@
1
1
  import type { ActionStorage } from "../../../core/index.js";
2
+ import { type Logger2 } from "../../../logger.js";
2
3
  import { type AutocompleteAction, type AutocompleteHandler } from "../Autocomplete/index.js";
3
4
  import type { Config } from "./types.js";
4
5
  declare module 'prosemirror-model' {
@@ -7,13 +8,14 @@ declare module 'prosemirror-model' {
7
8
  }
8
9
  }
9
10
  export type CommandHandlerParams = {
11
+ logger: Logger2.ILogger;
10
12
  actions: Config;
11
13
  storage: ActionStorage;
12
14
  nodesIgnoreList?: readonly string[];
13
15
  };
14
16
  export declare class CommandHandler implements AutocompleteHandler {
15
17
  #private;
16
- constructor({ actions, storage, nodesIgnoreList }: CommandHandlerParams);
18
+ constructor({ logger, actions, storage, nodesIgnoreList }: CommandHandlerParams);
17
19
  onOpen(action: AutocompleteAction): boolean;
18
20
  onFilter(action: AutocompleteAction): boolean;
19
21
  onArrow(action: AutocompleteAction): boolean;
@@ -1,12 +1,13 @@
1
- import { logger } from "../../../logger.js";
1
+ import { isFunction } from "../../../lodash.js";
2
+ import { globalLogger } from "../../../logger.js";
2
3
  import { AutocompletePopupCloser } from "../../../utils/autocomplete-popup.js";
3
4
  import { ArrayCarousel } from "../../../utils/carousel/index.js";
4
- import { isFunction } from "../../../lodash.js";
5
5
  import { AutocompleteActionKind, closeAutocomplete, } from "../Autocomplete/index.js";
6
6
  import { getReactRendererFromState } from "../ReactRenderer/index.js";
7
7
  import { render } from "./component.js";
8
8
  import { findDecoElem } from "./utils.js";
9
9
  export class CommandHandler {
10
+ #logger;
10
11
  #actions;
11
12
  #actionStorage;
12
13
  #nodesIgnoreList;
@@ -18,7 +19,8 @@ export class CommandHandler {
18
19
  #popupCloser;
19
20
  #menuProps;
20
21
  #menuRenderItem;
21
- constructor({ actions, storage, nodesIgnoreList = [] }) {
22
+ constructor({ logger, actions, storage, nodesIgnoreList = [] }) {
23
+ this.#logger = logger;
22
24
  this.#actions = actions;
23
25
  this.#actionStorage = storage;
24
26
  this.#nodesIgnoreList = nodesIgnoreList;
@@ -109,7 +111,8 @@ export class CommandHandler {
109
111
  view.dispatch(view.state.tr.deleteRange(range.from, range.to).scrollIntoView());
110
112
  action.exec(this.#actionStorage);
111
113
  view.focus();
112
- logger.action({ mode: 'wysiwyg', source: 'command-menu', action: action.id });
114
+ globalLogger.action({ mode: 'wysiwyg', source: 'command-menu', action: action.id });
115
+ this.#logger.action({ source: 'command-menu', action: action.id });
113
116
  }
114
117
  filterActions() {
115
118
  const currentItem = this.#filteredActionsCarousel?.currentItem;
@@ -1 +1 @@
1
- {"version":3,"file":"handler.js","sourceRoot":"../../../../../src","sources":["extensions/behavior/CommandMenu/handler.ts"],"names":[],"mappings":"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","sourcesContent":["import type {EditorView} from 'prosemirror-view';\n\nimport {logger} from '../../..//logger';\nimport {AutocompletePopupCloser} from '../../..//utils/autocomplete-popup';\nimport {ArrayCarousel} from '../../..//utils/carousel';\nimport type {ActionStorage} from '../../../core';\nimport {isFunction} from '../../../lodash';\nimport {\n type AutocompleteAction,\n AutocompleteActionKind,\n type AutocompleteHandler,\n type FromTo,\n closeAutocomplete,\n} from '../Autocomplete';\nimport {type RendererItem, getReactRendererFromState} from '../ReactRenderer';\n\nimport {type CommandMenuComponentProps, render} from './component';\nimport type {CommandAction, Config} from './types';\nimport {findDecoElem} from './utils';\n\ndeclare module 'prosemirror-model' {\n interface NodeSpec {\n commandMenu?: boolean;\n }\n}\n\nexport type CommandHandlerParams = {\n actions: Config;\n storage: ActionStorage;\n nodesIgnoreList?: readonly string[];\n};\n\nexport class CommandHandler implements AutocompleteHandler {\n readonly #actions: readonly CommandAction[];\n readonly #actionStorage: ActionStorage;\n readonly #nodesIgnoreList: readonly string[];\n #filteredActionsCarousel?: ArrayCarousel<CommandAction>;\n\n #view?: EditorView;\n #anchor: Element | null = null;\n #range?: FromTo;\n #filterText?: string;\n #popupCloser?: AutocompletePopupCloser;\n\n #menuProps?: CommandMenuComponentProps;\n #menuRenderItem?: RendererItem;\n\n constructor({actions, storage, nodesIgnoreList = []}: CommandHandlerParams) {\n this.#actions = actions;\n this.#actionStorage = storage;\n this.#nodesIgnoreList = nodesIgnoreList;\n }\n\n onOpen(action: AutocompleteAction): boolean {\n this.findAnchor();\n if (!this.#anchor || this.shouldIgnore(action)) {\n this.closeAutocomplete(action.view);\n return true;\n }\n\n this.#popupCloser = new AutocompletePopupCloser(action.view);\n this.updateState(action);\n this.filterActions();\n this.render();\n\n return true;\n }\n\n onFilter(action: AutocompleteAction): boolean {\n if (this.shouldIgnore(action) || action.filter?.endsWith(' ')) {\n this.closeAutocomplete(action.view);\n return true;\n }\n\n this.updateState(action);\n\n this.#filterText = action.filter?.trim().toLowerCase();\n const needToClose = this.filterActions();\n this.render();\n\n if (needToClose) {\n this.closeAutocomplete(action.view);\n }\n\n return true;\n }\n\n onArrow(action: AutocompleteAction): boolean {\n if (this.shouldIgnore(action)) {\n closeAutocomplete(action.view);\n return true;\n }\n\n this.updateState(action);\n\n if (!this.#filteredActionsCarousel) return false;\n\n switch (action.kind) {\n case AutocompleteActionKind.up: {\n this.#filteredActionsCarousel.prev();\n break;\n }\n case AutocompleteActionKind.down: {\n this.#filteredActionsCarousel.next();\n break;\n }\n default:\n return false;\n }\n\n this.render();\n\n return true;\n }\n\n onEnter(action: AutocompleteAction): boolean {\n if (this.shouldIgnore(action)) {\n closeAutocomplete(action.view);\n return true;\n }\n\n this.updateState(action);\n\n this.select();\n\n return true;\n }\n\n onClose(action: AutocompleteAction): boolean {\n this.updateState(action);\n\n this.clear();\n\n return true;\n }\n\n onDestroy(): void {\n this.clear();\n }\n\n private closeAutocomplete(view: EditorView) {\n setTimeout(() => {\n closeAutocomplete(view);\n });\n }\n\n private shouldIgnore(action: AutocompleteAction): boolean {\n const parentType = action.view.state.doc.resolve(action.range.from).parent.type;\n return (\n parentType.spec.commandMenu === false || this.#nodesIgnoreList.includes(parentType.name)\n );\n }\n\n private select() {\n if (!this.#view || !this.#range) return;\n\n const action = this.#filteredActionsCarousel?.currentItem;\n if (!action) return;\n\n const view = this.#view;\n const range = this.#range;\n\n view.dispatch(view.state.tr.deleteRange(range.from, range.to).scrollIntoView());\n action.exec(this.#actionStorage);\n view.focus();\n\n logger.action({mode: 'wysiwyg', source: 'command-menu', action: action.id});\n }\n\n private filterActions(): boolean {\n const currentItem = this.#filteredActionsCarousel?.currentItem;\n const inputText = this.#filterText;\n\n const enabledActions = this.#actions.filter((action) =>\n action.isEnable(this.#actionStorage),\n );\n\n let filteredActions = enabledActions;\n let needToClose = false;\n\n if (inputText) {\n filteredActions = filterActions(enabledActions, inputText);\n needToClose = !filteredActions.length && needToHide(enabledActions, inputText);\n }\n\n this.#filteredActionsCarousel = new ArrayCarousel(filteredActions);\n\n if (currentItem) {\n const newIndex = this.#filteredActionsCarousel.array.findIndex(\n (item) => item === currentItem,\n );\n if (newIndex !== -1) {\n this.#filteredActionsCarousel.currentIndex = newIndex;\n }\n }\n\n return needToClose;\n }\n\n private render() {\n this.findAnchor();\n const viewItems = this.#filteredActionsCarousel?.array ?? [];\n this.#menuProps = {\n anchorElement: this.#anchor,\n currentIndex: this.#filteredActionsCarousel?.currentIndex,\n items: viewItems,\n onItemClick: this.onItemClick,\n onOpenChange: this.#popupCloser?.popupOpenChangeHandler,\n };\n this.#menuRenderItem = this.#menuRenderItem ?? this.createMenuRenderItem();\n this.#menuRenderItem.rerender();\n }\n\n private onItemClick = (index: number) => {\n if (this.#filteredActionsCarousel) {\n this.#filteredActionsCarousel.currentIndex = index;\n this.select();\n }\n this.#view?.focus();\n };\n\n private updateState({view, range}: AutocompleteAction) {\n this.#view = view;\n this.#range = range;\n }\n\n private clear() {\n this.#view = undefined;\n this.#range = undefined;\n this.#anchor = null;\n this.#filterText = undefined;\n this.#filteredActionsCarousel = undefined;\n this.#popupCloser?.cancelTimer();\n this.#popupCloser = undefined;\n this.#menuProps = undefined;\n this.#menuRenderItem?.remove();\n this.#menuRenderItem = undefined;\n }\n\n private createMenuRenderItem(): RendererItem {\n return getReactRendererFromState(this.#view!.state).createItem('command_menu', () =>\n this.#menuProps ? render(this.#menuProps) : null,\n );\n }\n\n private findAnchor() {\n this.#anchor = findDecoElem(this.#view?.dom);\n }\n}\n\nfunction filterActions(actions: readonly CommandAction[], text: string): CommandAction[] {\n return actions.filter(\n (action) =>\n action.id.toLowerCase().includes(text) ||\n (isFunction(action.title) ? action.title() : action.title).toLowerCase().includes(text),\n );\n}\n\nconst CHARS_TO_HIDE = 4;\nfunction needToHide(actions: readonly CommandAction[], text: string): boolean {\n let iter = 1;\n do {\n const prevInput = text.slice(0, text.length - iter);\n const prevActions = filterActions(actions, prevInput);\n if (prevActions.length) break;\n iter++;\n } while (iter < text.length && iter < CHARS_TO_HIDE);\n return iter >= CHARS_TO_HIDE;\n}\n"]}
1
+ {"version":3,"file":"handler.js","sourceRoot":"../../../../../src","sources":["extensions/behavior/CommandMenu/handler.ts"],"names":[],"mappings":"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","sourcesContent":["import type {EditorView} from 'prosemirror-view';\n\nimport type {ActionStorage} from '../../../core';\nimport {isFunction} from '../../../lodash';\nimport {type Logger2, globalLogger} from '../../../logger';\nimport {AutocompletePopupCloser} from '../../../utils/autocomplete-popup';\nimport {ArrayCarousel} from '../../../utils/carousel';\nimport {\n type AutocompleteAction,\n AutocompleteActionKind,\n type AutocompleteHandler,\n type FromTo,\n closeAutocomplete,\n} from '../Autocomplete';\nimport {type RendererItem, getReactRendererFromState} from '../ReactRenderer';\n\nimport {type CommandMenuComponentProps, render} from './component';\nimport type {CommandAction, Config} from './types';\nimport {findDecoElem} from './utils';\n\ndeclare module 'prosemirror-model' {\n interface NodeSpec {\n commandMenu?: boolean;\n }\n}\n\nexport type CommandHandlerParams = {\n logger: Logger2.ILogger;\n actions: Config;\n storage: ActionStorage;\n nodesIgnoreList?: readonly string[];\n};\n\nexport class CommandHandler implements AutocompleteHandler {\n readonly #logger: Logger2.ILogger;\n readonly #actions: readonly CommandAction[];\n readonly #actionStorage: ActionStorage;\n readonly #nodesIgnoreList: readonly string[];\n #filteredActionsCarousel?: ArrayCarousel<CommandAction>;\n\n #view?: EditorView;\n #anchor: Element | null = null;\n #range?: FromTo;\n #filterText?: string;\n #popupCloser?: AutocompletePopupCloser;\n\n #menuProps?: CommandMenuComponentProps;\n #menuRenderItem?: RendererItem;\n\n constructor({logger, actions, storage, nodesIgnoreList = []}: CommandHandlerParams) {\n this.#logger = logger;\n this.#actions = actions;\n this.#actionStorage = storage;\n this.#nodesIgnoreList = nodesIgnoreList;\n }\n\n onOpen(action: AutocompleteAction): boolean {\n this.findAnchor();\n if (!this.#anchor || this.shouldIgnore(action)) {\n this.closeAutocomplete(action.view);\n return true;\n }\n\n this.#popupCloser = new AutocompletePopupCloser(action.view);\n this.updateState(action);\n this.filterActions();\n this.render();\n\n return true;\n }\n\n onFilter(action: AutocompleteAction): boolean {\n if (this.shouldIgnore(action) || action.filter?.endsWith(' ')) {\n this.closeAutocomplete(action.view);\n return true;\n }\n\n this.updateState(action);\n\n this.#filterText = action.filter?.trim().toLowerCase();\n const needToClose = this.filterActions();\n this.render();\n\n if (needToClose) {\n this.closeAutocomplete(action.view);\n }\n\n return true;\n }\n\n onArrow(action: AutocompleteAction): boolean {\n if (this.shouldIgnore(action)) {\n closeAutocomplete(action.view);\n return true;\n }\n\n this.updateState(action);\n\n if (!this.#filteredActionsCarousel) return false;\n\n switch (action.kind) {\n case AutocompleteActionKind.up: {\n this.#filteredActionsCarousel.prev();\n break;\n }\n case AutocompleteActionKind.down: {\n this.#filteredActionsCarousel.next();\n break;\n }\n default:\n return false;\n }\n\n this.render();\n\n return true;\n }\n\n onEnter(action: AutocompleteAction): boolean {\n if (this.shouldIgnore(action)) {\n closeAutocomplete(action.view);\n return true;\n }\n\n this.updateState(action);\n\n this.select();\n\n return true;\n }\n\n onClose(action: AutocompleteAction): boolean {\n this.updateState(action);\n\n this.clear();\n\n return true;\n }\n\n onDestroy(): void {\n this.clear();\n }\n\n private closeAutocomplete(view: EditorView) {\n setTimeout(() => {\n closeAutocomplete(view);\n });\n }\n\n private shouldIgnore(action: AutocompleteAction): boolean {\n const parentType = action.view.state.doc.resolve(action.range.from).parent.type;\n return (\n parentType.spec.commandMenu === false || this.#nodesIgnoreList.includes(parentType.name)\n );\n }\n\n private select() {\n if (!this.#view || !this.#range) return;\n\n const action = this.#filteredActionsCarousel?.currentItem;\n if (!action) return;\n\n const view = this.#view;\n const range = this.#range;\n\n view.dispatch(view.state.tr.deleteRange(range.from, range.to).scrollIntoView());\n action.exec(this.#actionStorage);\n view.focus();\n\n globalLogger.action({mode: 'wysiwyg', source: 'command-menu', action: action.id});\n this.#logger.action({source: 'command-menu', action: action.id});\n }\n\n private filterActions(): boolean {\n const currentItem = this.#filteredActionsCarousel?.currentItem;\n const inputText = this.#filterText;\n\n const enabledActions = this.#actions.filter((action) =>\n action.isEnable(this.#actionStorage),\n );\n\n let filteredActions = enabledActions;\n let needToClose = false;\n\n if (inputText) {\n filteredActions = filterActions(enabledActions, inputText);\n needToClose = !filteredActions.length && needToHide(enabledActions, inputText);\n }\n\n this.#filteredActionsCarousel = new ArrayCarousel(filteredActions);\n\n if (currentItem) {\n const newIndex = this.#filteredActionsCarousel.array.findIndex(\n (item) => item === currentItem,\n );\n if (newIndex !== -1) {\n this.#filteredActionsCarousel.currentIndex = newIndex;\n }\n }\n\n return needToClose;\n }\n\n private render() {\n this.findAnchor();\n const viewItems = this.#filteredActionsCarousel?.array ?? [];\n this.#menuProps = {\n anchorElement: this.#anchor,\n currentIndex: this.#filteredActionsCarousel?.currentIndex,\n items: viewItems,\n onItemClick: this.onItemClick,\n onOpenChange: this.#popupCloser?.popupOpenChangeHandler,\n };\n this.#menuRenderItem = this.#menuRenderItem ?? this.createMenuRenderItem();\n this.#menuRenderItem.rerender();\n }\n\n private onItemClick = (index: number) => {\n if (this.#filteredActionsCarousel) {\n this.#filteredActionsCarousel.currentIndex = index;\n this.select();\n }\n this.#view?.focus();\n };\n\n private updateState({view, range}: AutocompleteAction) {\n this.#view = view;\n this.#range = range;\n }\n\n private clear() {\n this.#view = undefined;\n this.#range = undefined;\n this.#anchor = null;\n this.#filterText = undefined;\n this.#filteredActionsCarousel = undefined;\n this.#popupCloser?.cancelTimer();\n this.#popupCloser = undefined;\n this.#menuProps = undefined;\n this.#menuRenderItem?.remove();\n this.#menuRenderItem = undefined;\n }\n\n private createMenuRenderItem(): RendererItem {\n return getReactRendererFromState(this.#view!.state).createItem('command_menu', () =>\n this.#menuProps ? render(this.#menuProps) : null,\n );\n }\n\n private findAnchor() {\n this.#anchor = findDecoElem(this.#view?.dom);\n }\n}\n\nfunction filterActions(actions: readonly CommandAction[], text: string): CommandAction[] {\n return actions.filter(\n (action) =>\n action.id.toLowerCase().includes(text) ||\n (isFunction(action.title) ? action.title() : action.title).toLowerCase().includes(text),\n );\n}\n\nconst CHARS_TO_HIDE = 4;\nfunction needToHide(actions: readonly CommandAction[], text: string): boolean {\n let iter = 1;\n do {\n const prevInput = text.slice(0, text.length - iter);\n const prevActions = filterActions(actions, prevInput);\n if (prevActions.length) break;\n iter++;\n } while (iter < text.length && iter < CHARS_TO_HIDE);\n return iter >= CHARS_TO_HIDE;\n}\n"]}
@@ -1,10 +1,10 @@
1
1
  import { DeflistNode, TableNode } from "../../markdown/index.js";
2
2
  import { CheckboxNode, CutNode, TabsNode, YfmNoteNode } from "../../yfm/index.js";
3
- import { logger } from "../../../logger.js";
3
+ import { globalLogger } from "../../../logger.js";
4
4
  import { Autocomplete } from "../Autocomplete/index.js";
5
5
  import { DecoClassName } from "./const.js";
6
6
  import { CommandHandler } from "./handler.js";
7
- const getCommandMenuAutocompleteItem = (opts) => ({ actions }) => ({
7
+ const getCommandMenuAutocompleteItem = (opts, logger) => ({ actions }) => ({
8
8
  trigger: {
9
9
  name: 'command',
10
10
  trigger: /(?:^|\s)(\/)$/,
@@ -13,6 +13,7 @@ const getCommandMenuAutocompleteItem = (opts) => ({ actions }) => ({
13
13
  decorationAttrs: { class: DecoClassName },
14
14
  },
15
15
  handler: new CommandHandler({
16
+ logger,
16
17
  storage: actions,
17
18
  actions: opts.actions,
18
19
  // TODO: add commandMenu=false flag to specs:
@@ -29,12 +30,13 @@ const getCommandMenuAutocompleteItem = (opts) => ({ actions }) => ({
29
30
  });
30
31
  export const CommandMenu = (builder, opts) => {
31
32
  if (!Array.isArray(opts.actions) || opts.actions.length === 0) {
32
- logger.info("[CommandMenu extension]: Skip because 'actions' is not an array or is empty");
33
+ globalLogger.log("[CommandMenu extension]: Skip because 'actions' is not an array or is empty");
34
+ builder.logger.log("[CommandMenu extension]: Skip because 'actions' is not an array or is empty");
33
35
  return;
34
36
  }
35
37
  if (!builder.context.has('autocomplete')) {
36
38
  builder.use(Autocomplete);
37
39
  }
38
- builder.context.get('autocomplete').add(getCommandMenuAutocompleteItem(opts));
40
+ builder.context.get('autocomplete').add(getCommandMenuAutocompleteItem(opts, builder.logger));
39
41
  };
40
42
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"../../../../../src","sources":["extensions/behavior/CommandMenu/index.ts"],"names":[],"mappings":"AACA,OAAO,EAAC,WAAW,EAAE,SAAS,EAAC,gCAAqC;AACpE,OAAO,EAAC,YAAY,EAAE,OAAO,EAAE,QAAQ,EAAE,WAAW,EAAC,2BAAgC;AACrF,OAAO,EAAC,MAAM,EAAC,2BAAwB;AACvC,OAAO,EAAC,YAAY,EAA0B,iCAAwB;AAEtE,OAAO,EAAC,aAAa,EAAC,mBAAgB;AACtC,OAAO,EAAC,cAAc,EAAC,qBAAkB;AAQzC,MAAM,8BAA8B,GAChC,CAAC,IAAwB,EAAsB,EAAE,CACjD,CAAC,EAAC,OAAO,EAAC,EAAE,EAAE,CAAC,CAAC;IACZ,OAAO,EAAE;QACL,IAAI,EAAE,SAAS;QACf,OAAO,EAAE,eAAe;QACxB,YAAY,EAAE,KAAK;QACnB,kBAAkB,EAAE,IAAI;QACxB,eAAe,EAAE,EAAC,KAAK,EAAE,aAAa,EAAC;KAC1C;IACD,OAAO,EAAE,IAAI,cAAc,CAAC;QACxB,OAAO,EAAE,OAAO;QAChB,OAAO,EAAE,IAAI,CAAC,OAAO;QACrB,6CAA6C;QAC7C,eAAe,EAAE,CAAC,IAAI,CAAC,eAAe,IAAI,EAAE,CAAC,CAAC,MAAM,CAAC;YACjD,WAAW,CAAC,IAAI;YAChB,SAAS,CAAC,UAAU;YACpB,SAAS,CAAC,QAAQ;YAClB,YAAY,CAAC,KAAK;YAClB,WAAW,CAAC,SAAS;YACrB,OAAO,CAAC,QAAQ;YAChB,QAAQ,CAAC,GAAG;SACf,CAAC;KACL,CAAC;CACL,CAAC,CAAC;AAEP,MAAM,CAAC,MAAM,WAAW,GAAsC,CAAC,OAAO,EAAE,IAAI,EAAE,EAAE;IAC5E,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC,IAAI,IAAI,CAAC,OAAO,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAC5D,MAAM,CAAC,IAAI,CAAC,6EAA6E,CAAC,CAAC;QAC3F,OAAO;IACX,CAAC;IACD,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,GAAG,CAAC,cAAc,CAAC,EAAE,CAAC;QACvC,OAAO,CAAC,GAAG,CAAC,YAAY,CAAC,CAAC;IAC9B,CAAC;IACD,OAAO,CAAC,OAAO,CAAC,GAAG,CAAC,cAAc,CAAE,CAAC,GAAG,CAAC,8BAA8B,CAAC,IAAI,CAAC,CAAC,CAAC;AACnF,CAAC,CAAC","sourcesContent":["import type {ExtensionAuto} from '../../../core';\nimport {DeflistNode, TableNode} from '../../../extensions/markdown';\nimport {CheckboxNode, CutNode, TabsNode, YfmNoteNode} from '../../../extensions/yfm';\nimport {logger} from '../../../logger';\nimport {Autocomplete, type AutocompleteItemFn} from '../Autocomplete';\n\nimport {DecoClassName} from './const';\nimport {CommandHandler} from './handler';\nimport type {Config} from './types';\n\nexport type CommandMenuOptions = {\n actions: Config;\n nodesIgnoreList?: readonly string[];\n};\n\nconst getCommandMenuAutocompleteItem =\n (opts: CommandMenuOptions): AutocompleteItemFn =>\n ({actions}) => ({\n trigger: {\n name: 'command',\n trigger: /(?:^|\\s)(\\/)$/,\n allArrowKeys: false,\n cancelOnFirstSpace: true,\n decorationAttrs: {class: DecoClassName},\n },\n handler: new CommandHandler({\n storage: actions,\n actions: opts.actions,\n // TODO: add commandMenu=false flag to specs:\n nodesIgnoreList: (opts.nodesIgnoreList ?? []).concat([\n DeflistNode.Term,\n TableNode.HeaderCell,\n TableNode.DataCell,\n CheckboxNode.Label,\n YfmNoteNode.NoteTitle,\n CutNode.CutTitle,\n TabsNode.Tab,\n ]),\n }),\n });\n\nexport const CommandMenu: ExtensionAuto<CommandMenuOptions> = (builder, opts) => {\n if (!Array.isArray(opts.actions) || opts.actions.length === 0) {\n logger.info(\"[CommandMenu extension]: Skip because 'actions' is not an array or is empty\");\n return;\n }\n if (!builder.context.has('autocomplete')) {\n builder.use(Autocomplete);\n }\n builder.context.get('autocomplete')!.add(getCommandMenuAutocompleteItem(opts));\n};\n"]}
1
+ {"version":3,"file":"index.js","sourceRoot":"../../../../../src","sources":["extensions/behavior/CommandMenu/index.ts"],"names":[],"mappings":"AACA,OAAO,EAAC,WAAW,EAAE,SAAS,EAAC,gCAAqC;AACpE,OAAO,EAAC,YAAY,EAAE,OAAO,EAAE,QAAQ,EAAE,WAAW,EAAC,2BAAgC;AACrF,OAAO,EAAe,YAAY,EAAC,2BAAwB;AAC3D,OAAO,EAAC,YAAY,EAA0B,iCAAwB;AAEtE,OAAO,EAAC,aAAa,EAAC,mBAAgB;AACtC,OAAO,EAAC,cAAc,EAAC,qBAAkB;AAQzC,MAAM,8BAA8B,GAChC,CAAC,IAAwB,EAAE,MAAuB,EAAsB,EAAE,CAC1E,CAAC,EAAC,OAAO,EAAC,EAAE,EAAE,CAAC,CAAC;IACZ,OAAO,EAAE;QACL,IAAI,EAAE,SAAS;QACf,OAAO,EAAE,eAAe;QACxB,YAAY,EAAE,KAAK;QACnB,kBAAkB,EAAE,IAAI;QACxB,eAAe,EAAE,EAAC,KAAK,EAAE,aAAa,EAAC;KAC1C;IACD,OAAO,EAAE,IAAI,cAAc,CAAC;QACxB,MAAM;QACN,OAAO,EAAE,OAAO;QAChB,OAAO,EAAE,IAAI,CAAC,OAAO;QACrB,6CAA6C;QAC7C,eAAe,EAAE,CAAC,IAAI,CAAC,eAAe,IAAI,EAAE,CAAC,CAAC,MAAM,CAAC;YACjD,WAAW,CAAC,IAAI;YAChB,SAAS,CAAC,UAAU;YACpB,SAAS,CAAC,QAAQ;YAClB,YAAY,CAAC,KAAK;YAClB,WAAW,CAAC,SAAS;YACrB,OAAO,CAAC,QAAQ;YAChB,QAAQ,CAAC,GAAG;SACf,CAAC;KACL,CAAC;CACL,CAAC,CAAC;AAEP,MAAM,CAAC,MAAM,WAAW,GAAsC,CAAC,OAAO,EAAE,IAAI,EAAE,EAAE;IAC5E,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC,IAAI,IAAI,CAAC,OAAO,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAC5D,YAAY,CAAC,GAAG,CACZ,6EAA6E,CAChF,CAAC;QACF,OAAO,CAAC,MAAM,CAAC,GAAG,CACd,6EAA6E,CAChF,CAAC;QACF,OAAO;IACX,CAAC;IACD,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,GAAG,CAAC,cAAc,CAAC,EAAE,CAAC;QACvC,OAAO,CAAC,GAAG,CAAC,YAAY,CAAC,CAAC;IAC9B,CAAC;IACD,OAAO,CAAC,OAAO,CAAC,GAAG,CAAC,cAAc,CAAE,CAAC,GAAG,CAAC,8BAA8B,CAAC,IAAI,EAAE,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC;AACnG,CAAC,CAAC","sourcesContent":["import type {ExtensionAuto} from '../../../core';\nimport {DeflistNode, TableNode} from '../../../extensions/markdown';\nimport {CheckboxNode, CutNode, TabsNode, YfmNoteNode} from '../../../extensions/yfm';\nimport {type Logger2, globalLogger} from '../../../logger';\nimport {Autocomplete, type AutocompleteItemFn} from '../Autocomplete';\n\nimport {DecoClassName} from './const';\nimport {CommandHandler} from './handler';\nimport type {Config} from './types';\n\nexport type CommandMenuOptions = {\n actions: Config;\n nodesIgnoreList?: readonly string[];\n};\n\nconst getCommandMenuAutocompleteItem =\n (opts: CommandMenuOptions, logger: Logger2.ILogger): AutocompleteItemFn =>\n ({actions}) => ({\n trigger: {\n name: 'command',\n trigger: /(?:^|\\s)(\\/)$/,\n allArrowKeys: false,\n cancelOnFirstSpace: true,\n decorationAttrs: {class: DecoClassName},\n },\n handler: new CommandHandler({\n logger,\n storage: actions,\n actions: opts.actions,\n // TODO: add commandMenu=false flag to specs:\n nodesIgnoreList: (opts.nodesIgnoreList ?? []).concat([\n DeflistNode.Term,\n TableNode.HeaderCell,\n TableNode.DataCell,\n CheckboxNode.Label,\n YfmNoteNode.NoteTitle,\n CutNode.CutTitle,\n TabsNode.Tab,\n ]),\n }),\n });\n\nexport const CommandMenu: ExtensionAuto<CommandMenuOptions> = (builder, opts) => {\n if (!Array.isArray(opts.actions) || opts.actions.length === 0) {\n globalLogger.log(\n \"[CommandMenu extension]: Skip because 'actions' is not an array or is empty\",\n );\n builder.logger.log(\n \"[CommandMenu extension]: Skip because 'actions' is not an array or is empty\",\n );\n return;\n }\n if (!builder.context.has('autocomplete')) {\n builder.use(Autocomplete);\n }\n builder.context.get('autocomplete')!.add(getCommandMenuAutocompleteItem(opts, builder.logger));\n};\n"]}
@@ -7,10 +7,21 @@ export const EditorModeKeymap = (builder, opts) => {
7
7
  builder.addKeymap(() => {
8
8
  const bindings = {};
9
9
  const { onCancel, onSubmit } = opts;
10
+ const logger = builder.logger.nested({
11
+ source: 'keymap',
12
+ });
10
13
  if (onCancel)
11
- bindings[f.toPM(A.Cancel)] = () => onCancel();
14
+ bindings[f.toPM(A.Cancel)] = () => {
15
+ const result = onCancel();
16
+ logger.event({ event: 'cancel', result });
17
+ return result;
18
+ };
12
19
  if (onSubmit)
13
- bindings[f.toPM(A.Submit)] = () => onSubmit();
20
+ bindings[f.toPM(A.Submit)] = () => {
21
+ const result = onSubmit();
22
+ logger.event({ event: 'submit', result });
23
+ return result;
24
+ };
14
25
  bindings[f.toPM(A.__debug)] = () => {
15
26
  debug();
16
27
  return true;
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"../../../../../src","sources":["extensions/behavior/EditorModeKeymap/index.ts"],"names":[],"mappings":"AACA,OAAO,EAAC,MAAM,IAAI,CAAC,EAAE,SAAS,IAAI,CAAC,EAAC,oCAA2B;AAC/D,OAAO,EAAC,OAAO,EAAC,4BAAyB;AAUzC;;GAEG;AACH,MAAM,CAAC,MAAM,gBAAgB,GAA2C,CAAC,OAAO,EAAE,IAAI,EAAE,EAAE;IACtF,OAAO,CAAC,SAAS,CAAC,GAAG,EAAE;QACnB,MAAM,QAAQ,GAAW,EAAE,CAAC;QAC5B,MAAM,EAAC,QAAQ,EAAE,QAAQ,EAAC,GAAG,IAAI,CAAC;QAElC,IAAI,QAAQ;YAAE,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,MAAM,CAAE,CAAC,GAAG,GAAG,EAAE,CAAC,QAAQ,EAAE,CAAC;QAC7D,IAAI,QAAQ;YAAE,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,MAAM,CAAE,CAAC,GAAG,GAAG,EAAE,CAAC,QAAQ,EAAE,CAAC;QAE7D,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,OAAO,CAAE,CAAC,GAAG,GAAG,EAAE;YAChC,KAAK,EAAE,CAAC;YACR,OAAO,IAAI,CAAC;QAChB,CAAC,CAAC;QAEF,OAAO,QAAQ,CAAC;IACpB,CAAC,CAAC,CAAC;IAEH,IAAI,IAAI,CAAC,cAAc,EAAE,MAAM,EAAE,CAAC;QAC9B,MAAM,MAAM,GAAG,GAAG,EAAE,CAAC,IAAI,CAAC;QAC1B,MAAM,QAAQ,GAAW,EAAE,CAAC;QAC5B,KAAK,MAAM,GAAG,IAAI,IAAI,CAAC,cAAc,EAAE,CAAC;YACpC,QAAQ,CAAC,GAAG,CAAC,GAAG,MAAM,CAAC;QAC3B,CAAC;QACD,OAAO,CAAC,SAAS,CAAC,GAAG,EAAE,CAAC,QAAQ,EAAE,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC;IAC/D,CAAC;AACL,CAAC,CAAC;AAEF,SAAS,KAAK;IACV,MAAM,OAAO,GAAG,CAAC,uBAAuB,EAAE,YAAY,OAAO,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAC5E,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;AAC1B,CAAC","sourcesContent":["import type {ExtensionAuto, Keymap} from '../../../core';\nimport {Action as A, formatter as f} from '../../../shortcuts';\nimport {VERSION} from '../../../version';\n\nexport type EditorModeKeymapOptions = {\n /** Submit handler. Return true to stop propagation. */\n onSubmit?(): boolean;\n /** Cancel handler. Return true to stop propagation. */\n onCancel?(): boolean;\n ignoreKeysList?: string[];\n};\n\n/**\n * Use this extension if you need to handle form actions like cancel and/or submit.\n */\nexport const EditorModeKeymap: ExtensionAuto<EditorModeKeymapOptions> = (builder, opts) => {\n builder.addKeymap(() => {\n const bindings: Keymap = {};\n const {onCancel, onSubmit} = opts;\n\n if (onCancel) bindings[f.toPM(A.Cancel)!] = () => onCancel();\n if (onSubmit) bindings[f.toPM(A.Submit)!] = () => onSubmit();\n\n bindings[f.toPM(A.__debug)!] = () => {\n debug();\n return true;\n };\n\n return bindings;\n });\n\n if (opts.ignoreKeysList?.length) {\n const ignore = () => true;\n const bindings: Keymap = {};\n for (const key of opts.ignoreKeysList) {\n bindings[key] = ignore;\n }\n builder.addKeymap(() => bindings, builder.Priority.Lowest);\n }\n};\n\nfunction debug() {\n const message = ['YFM-Editor Debug info', `Version: ${VERSION}`].join('\\n');\n console.info(message);\n}\n"]}
1
+ {"version":3,"file":"index.js","sourceRoot":"../../../../../src","sources":["extensions/behavior/EditorModeKeymap/index.ts"],"names":[],"mappings":"AACA,OAAO,EAAC,MAAM,IAAI,CAAC,EAAE,SAAS,IAAI,CAAC,EAAC,oCAA2B;AAC/D,OAAO,EAAC,OAAO,EAAC,4BAAyB;AAUzC;;GAEG;AACH,MAAM,CAAC,MAAM,gBAAgB,GAA2C,CAAC,OAAO,EAAE,IAAI,EAAE,EAAE;IACtF,OAAO,CAAC,SAAS,CAAC,GAAG,EAAE;QACnB,MAAM,QAAQ,GAAW,EAAE,CAAC;QAC5B,MAAM,EAAC,QAAQ,EAAE,QAAQ,EAAC,GAAG,IAAI,CAAC;QAClC,MAAM,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,MAAM,CAAC;YACjC,MAAM,EAAE,QAAQ;SACnB,CAAC,CAAC;QAEH,IAAI,QAAQ;YACR,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,MAAM,CAAE,CAAC,GAAG,GAAG,EAAE;gBAC/B,MAAM,MAAM,GAAG,QAAQ,EAAE,CAAC;gBAC1B,MAAM,CAAC,KAAK,CAAC,EAAC,KAAK,EAAE,QAAQ,EAAE,MAAM,EAAC,CAAC,CAAC;gBACxC,OAAO,MAAM,CAAC;YAClB,CAAC,CAAC;QACN,IAAI,QAAQ;YACR,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,MAAM,CAAE,CAAC,GAAG,GAAG,EAAE;gBAC/B,MAAM,MAAM,GAAG,QAAQ,EAAE,CAAC;gBAC1B,MAAM,CAAC,KAAK,CAAC,EAAC,KAAK,EAAE,QAAQ,EAAE,MAAM,EAAC,CAAC,CAAC;gBACxC,OAAO,MAAM,CAAC;YAClB,CAAC,CAAC;QAEN,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,OAAO,CAAE,CAAC,GAAG,GAAG,EAAE;YAChC,KAAK,EAAE,CAAC;YACR,OAAO,IAAI,CAAC;QAChB,CAAC,CAAC;QAEF,OAAO,QAAQ,CAAC;IACpB,CAAC,CAAC,CAAC;IAEH,IAAI,IAAI,CAAC,cAAc,EAAE,MAAM,EAAE,CAAC;QAC9B,MAAM,MAAM,GAAG,GAAG,EAAE,CAAC,IAAI,CAAC;QAC1B,MAAM,QAAQ,GAAW,EAAE,CAAC;QAC5B,KAAK,MAAM,GAAG,IAAI,IAAI,CAAC,cAAc,EAAE,CAAC;YACpC,QAAQ,CAAC,GAAG,CAAC,GAAG,MAAM,CAAC;QAC3B,CAAC;QACD,OAAO,CAAC,SAAS,CAAC,GAAG,EAAE,CAAC,QAAQ,EAAE,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC;IAC/D,CAAC;AACL,CAAC,CAAC;AAEF,SAAS,KAAK;IACV,MAAM,OAAO,GAAG,CAAC,uBAAuB,EAAE,YAAY,OAAO,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAC5E,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;AAC1B,CAAC","sourcesContent":["import type {ExtensionAuto, Keymap} from '../../../core';\nimport {Action as A, formatter as f} from '../../../shortcuts';\nimport {VERSION} from '../../../version';\n\nexport type EditorModeKeymapOptions = {\n /** Submit handler. Return true to stop propagation. */\n onSubmit?(): boolean;\n /** Cancel handler. Return true to stop propagation. */\n onCancel?(): boolean;\n ignoreKeysList?: string[];\n};\n\n/**\n * Use this extension if you need to handle form actions like cancel and/or submit.\n */\nexport const EditorModeKeymap: ExtensionAuto<EditorModeKeymapOptions> = (builder, opts) => {\n builder.addKeymap(() => {\n const bindings: Keymap = {};\n const {onCancel, onSubmit} = opts;\n const logger = builder.logger.nested({\n source: 'keymap',\n });\n\n if (onCancel)\n bindings[f.toPM(A.Cancel)!] = () => {\n const result = onCancel();\n logger.event({event: 'cancel', result});\n return result;\n };\n if (onSubmit)\n bindings[f.toPM(A.Submit)!] = () => {\n const result = onSubmit();\n logger.event({event: 'submit', result});\n return result;\n };\n\n bindings[f.toPM(A.__debug)!] = () => {\n debug();\n return true;\n };\n\n return bindings;\n });\n\n if (opts.ignoreKeysList?.length) {\n const ignore = () => true;\n const bindings: Keymap = {};\n for (const key of opts.ignoreKeysList) {\n bindings[key] = ignore;\n }\n builder.addKeymap(() => bindings, builder.Priority.Lowest);\n }\n};\n\nfunction debug() {\n const message = ['YFM-Editor Debug info', `Version: ${VERSION}`].join('\\n');\n console.info(message);\n}\n"]}
@@ -1,2 +1,2 @@
1
- import type { ExtensionAuto } from "../../../core/index.js";
1
+ import { type ExtensionAuto } from "../../../core/index.js";
2
2
  export declare const FilePaste: ExtensionAuto;
@@ -1,6 +1,7 @@
1
1
  import { Fragment, Slice } from 'prosemirror-model';
2
2
  import { Plugin } from 'prosemirror-state';
3
3
  import { dropPoint } from 'prosemirror-transform';
4
+ import { getLoggerFromState } from "../../../core/index.js";
4
5
  import { pType } from "../../base/index.js";
5
6
  import { isFilesOnly } from "../Clipboard/utils.js";
6
7
  // Custom handler of pasted (or dropped) files to prevent insert a file preview in base64-format into editor's content (or open file in browser)
@@ -12,6 +13,11 @@ export const FilePaste = (builder) => {
12
13
  const files = getFiles(event.clipboardData);
13
14
  if (!files)
14
15
  return false;
16
+ getLoggerFromState(view.state).event({
17
+ event: 'paste-files',
18
+ plugin: 'file-paste',
19
+ prop: 'handlePaste',
20
+ });
15
21
  view.dispatch(view.state.tr
16
22
  .replaceSelection(createFilesSlice(view.state.schema, files))
17
23
  .scrollIntoView());
@@ -28,6 +34,12 @@ export const FilePaste = (builder) => {
28
34
  if (dropPos === -1)
29
35
  return false;
30
36
  const posToInsert = dropPoint(view.state.doc, dropPos, slice);
37
+ getLoggerFromState(view.state).event({
38
+ event: 'drop-files',
39
+ plugin: 'file-paste',
40
+ prop: 'handleDrop',
41
+ dispatch: posToInsert !== null,
42
+ });
31
43
  if (posToInsert === null)
32
44
  return false;
33
45
  view.dispatch(view.state.tr.insert(posToInsert, slice.content));
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"../../../../../src","sources":["extensions/behavior/FilePaste/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAC,QAAQ,EAA0B,KAAK,EAAC,MAAM,mBAAmB,CAAC;AAC1E,OAAO,EAAC,MAAM,EAAC,MAAM,mBAAmB,CAAC;AACzC,OAAO,EAAC,SAAS,EAAC,MAAM,uBAAuB,CAAC;AAGhD,OAAO,EAAC,KAAK,EAAC,4BAAiC;AAC/C,OAAO,EAAC,WAAW,EAAC,8BAA2B;AAE/C,gJAAgJ;AAChJ,MAAM,CAAC,MAAM,SAAS,GAAkB,CAAC,OAAO,EAAE,EAAE;IAChD,OAAO,CAAC,SAAS,CAAC,GAAG,EAAE;QACnB,OAAO,IAAI,MAAM,CAAC;YACd,KAAK,EAAE;gBACH,WAAW,CAAC,IAAI,EAAE,KAAK;oBACnB,MAAM,KAAK,GAAG,QAAQ,CAAC,KAAK,CAAC,aAAa,CAAC,CAAC;oBAC5C,IAAI,CAAC,KAAK;wBAAE,OAAO,KAAK,CAAC;oBAEzB,IAAI,CAAC,QAAQ,CACT,IAAI,CAAC,KAAK,CAAC,EAAE;yBACR,gBAAgB,CAAC,gBAAgB,CAAC,IAAI,CAAC,KAAK,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC;yBAC5D,cAAc,EAAE,CACxB,CAAC;oBAEF,OAAO,IAAI,CAAC;gBAChB,CAAC;gBACD,UAAU,CAAC,IAAI,EAAE,KAAK;oBAClB,IAAI,IAAI,CAAC,QAAQ;wBAAE,OAAO,KAAK,CAAC;oBAEhC,MAAM,KAAK,GAAG,QAAQ,CAAC,KAAK,CAAC,YAAY,CAAC,CAAC;oBAC3C,IAAI,CAAC,KAAK;wBAAE,OAAO,KAAK,CAAC;oBAEzB,MAAM,KAAK,GAAG,gBAAgB,CAAC,IAAI,CAAC,KAAK,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC;oBAEzD,MAAM,OAAO,GACT,IAAI,CAAC,WAAW,CAAC,EAAC,IAAI,EAAE,KAAK,CAAC,OAAO,EAAE,GAAG,EAAE,KAAK,CAAC,OAAO,EAAC,CAAC,EAAE,GAAG,IAAI,CAAC,CAAC,CAAC;oBAC3E,IAAI,OAAO,KAAK,CAAC,CAAC;wBAAE,OAAO,KAAK,CAAC;oBAEjC,MAAM,WAAW,GAAG,SAAS,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,EAAE,OAAO,EAAE,KAAK,CAAC,CAAC;oBAC9D,IAAI,WAAW,KAAK,IAAI;wBAAE,OAAO,KAAK,CAAC;oBAEvC,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,MAAM,CAAC,WAAW,EAAE,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC;oBAChE,OAAO,IAAI,CAAC;gBAChB,CAAC;aACJ;SACJ,CAAC,CAAC;IACP,CAAC,EAAE,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC;AAChC,CAAC,CAAC;AAEF,SAAS,QAAQ,CAAC,YAAiC;IAC/C,IAAI,CAAC,YAAY,IAAI,CAAC,WAAW,CAAC,YAAY,CAAC;QAAE,OAAO,IAAI,CAAC;IAC7D,OAAO,KAAK,CAAC,IAAI,CAAC,YAAY,CAAC,KAAK,CAAC,CAAC;AAC1C,CAAC;AAED,SAAS,gBAAgB,CAAC,MAAc,EAAE,KAAa;IACnD,MAAM,KAAK,GAAW,EAAE,CAAC;IACzB,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;QACvB,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,MAAM,CAAC,IAAI,EAAE,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IACnE,CAAC;IACD,OAAO,IAAI,KAAK,CAAC,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC;AACjD,CAAC","sourcesContent":["import {Fragment, type Node, type Schema, Slice} from 'prosemirror-model';\nimport {Plugin} from 'prosemirror-state';\nimport {dropPoint} from 'prosemirror-transform';\n\nimport type {ExtensionAuto} from '../../../core';\nimport {pType} from '../../../extensions/base';\nimport {isFilesOnly} from '../Clipboard/utils';\n\n// Custom handler of pasted (or dropped) files to prevent insert a file preview in base64-format into editor's content (or open file in browser)\nexport const FilePaste: ExtensionAuto = (builder) => {\n builder.addPlugin(() => {\n return new Plugin({\n props: {\n handlePaste(view, event) {\n const files = getFiles(event.clipboardData);\n if (!files) return false;\n\n view.dispatch(\n view.state.tr\n .replaceSelection(createFilesSlice(view.state.schema, files))\n .scrollIntoView(),\n );\n\n return true;\n },\n handleDrop(view, event) {\n if (view.dragging) return false;\n\n const files = getFiles(event.dataTransfer);\n if (!files) return false;\n\n const slice = createFilesSlice(view.state.schema, files);\n\n const dropPos =\n view.posAtCoords({left: event.clientX, top: event.clientY})?.pos ?? -1;\n if (dropPos === -1) return false;\n\n const posToInsert = dropPoint(view.state.doc, dropPos, slice);\n if (posToInsert === null) return false;\n\n view.dispatch(view.state.tr.insert(posToInsert, slice.content));\n return true;\n },\n },\n });\n }, builder.Priority.Lowest);\n};\n\nfunction getFiles(dataTransfer: DataTransfer | null) {\n if (!dataTransfer || !isFilesOnly(dataTransfer)) return null;\n return Array.from(dataTransfer.files);\n}\n\nfunction createFilesSlice(schema: Schema, files: File[]): Slice {\n const nodes: Node[] = [];\n for (const file of files) {\n nodes.push(pType(schema).create(null, schema.text(file.name)));\n }\n return new Slice(Fragment.from(nodes), 0, 0);\n}\n"]}
1
+ {"version":3,"file":"index.js","sourceRoot":"../../../../../src","sources":["extensions/behavior/FilePaste/index.ts"],"names":[],"mappings":"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","sourcesContent":["import {Fragment, type Node, type Schema, Slice} from 'prosemirror-model';\nimport {Plugin} from 'prosemirror-state';\nimport {dropPoint} from 'prosemirror-transform';\n\nimport {type ExtensionAuto, getLoggerFromState} from '../../../core';\nimport {pType} from '../../../extensions/base';\nimport {isFilesOnly} from '../Clipboard/utils';\n\n// Custom handler of pasted (or dropped) files to prevent insert a file preview in base64-format into editor's content (or open file in browser)\nexport const FilePaste: ExtensionAuto = (builder) => {\n builder.addPlugin(() => {\n return new Plugin({\n props: {\n handlePaste(view, event) {\n const files = getFiles(event.clipboardData);\n if (!files) return false;\n\n getLoggerFromState(view.state).event({\n event: 'paste-files',\n plugin: 'file-paste',\n prop: 'handlePaste',\n });\n\n view.dispatch(\n view.state.tr\n .replaceSelection(createFilesSlice(view.state.schema, files))\n .scrollIntoView(),\n );\n\n return true;\n },\n handleDrop(view, event) {\n if (view.dragging) return false;\n\n const files = getFiles(event.dataTransfer);\n if (!files) return false;\n\n const slice = createFilesSlice(view.state.schema, files);\n\n const dropPos =\n view.posAtCoords({left: event.clientX, top: event.clientY})?.pos ?? -1;\n if (dropPos === -1) return false;\n\n const posToInsert = dropPoint(view.state.doc, dropPos, slice);\n\n getLoggerFromState(view.state).event({\n event: 'drop-files',\n plugin: 'file-paste',\n prop: 'handleDrop',\n dispatch: posToInsert !== null,\n });\n\n if (posToInsert === null) return false;\n\n view.dispatch(view.state.tr.insert(posToInsert, slice.content));\n return true;\n },\n },\n });\n }, builder.Priority.Lowest);\n};\n\nfunction getFiles(dataTransfer: DataTransfer | null) {\n if (!dataTransfer || !isFilesOnly(dataTransfer)) return null;\n return Array.from(dataTransfer.files);\n}\n\nfunction createFilesSlice(schema: Schema, files: File[]): Slice {\n const nodes: Node[] = [];\n for (const file of files) {\n nodes.push(pType(schema).create(null, schema.text(file.name)));\n }\n return new Slice(Fragment.from(nodes), 0, 0);\n}\n"]}
@@ -4,7 +4,7 @@ import { isCodeBlock } from "../../../utils/nodes.js";
4
4
  import { TooltipView } from "./tooltip.js";
5
5
  export const SelectionContext = (builder, { config }) => {
6
6
  if (Array.isArray(config) && config.length > 0) {
7
- builder.addPlugin(({ actions }) => new Plugin(new SelectionTooltip(actions, config)));
7
+ builder.addPlugin(({ actions }) => new Plugin(new SelectionTooltip(actions, config, builder.logger)));
8
8
  }
9
9
  };
10
10
  class SelectionTooltip {
@@ -12,8 +12,8 @@ class SelectionTooltip {
12
12
  tooltip;
13
13
  hideTimeoutRef = null;
14
14
  _isMousePressed = false;
15
- constructor(actions, menuConfig) {
16
- this.tooltip = new TooltipView(actions, menuConfig);
15
+ constructor(actions, menuConfig, logger) {
16
+ this.tooltip = new TooltipView(actions, menuConfig, logger);
17
17
  }
18
18
  get props() {
19
19
  return {
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"../../../../../src","sources":["extensions/behavior/SelectionContext/index.ts"],"names":[],"mappings":"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","sourcesContent":["import {keydownHandler} from 'prosemirror-keymap';\nimport {\n AllSelection,\n type EditorState,\n Plugin,\n type PluginSpec,\n TextSelection,\n} from 'prosemirror-state';\nimport type {EditorProps, EditorView} from 'prosemirror-view';\n\nimport type {ActionStorage, ExtensionAuto} from '../../../core';\nimport {isCodeBlock} from '../../../utils/nodes';\n\nimport {type ContextConfig, TooltipView} from './tooltip';\n\nexport type {\n ContextConfig as SelectionContextConfig,\n ContextGroupItemData as SelectionContextItemData,\n} from './tooltip';\n\nexport type SelectionContextOptions = {\n config?: ContextConfig;\n};\n\nexport const SelectionContext: ExtensionAuto<SelectionContextOptions> = (builder, {config}) => {\n if (Array.isArray(config) && config.length > 0) {\n builder.addPlugin(({actions}) => new Plugin(new SelectionTooltip(actions, config)));\n }\n};\n\ntype TinyState = Pick<EditorState, 'doc' | 'selection'>;\n\nclass SelectionTooltip implements PluginSpec<unknown> {\n private destroyed = false;\n\n private tooltip: TooltipView;\n private hideTimeoutRef: ReturnType<typeof setTimeout> | null = null;\n\n private _isMousePressed = false;\n\n constructor(actions: ActionStorage, menuConfig: ContextConfig) {\n this.tooltip = new TooltipView(actions, menuConfig);\n }\n\n get props(): EditorProps {\n return {\n // same as keymap({})\n handleKeyDown: keydownHandler({\n // hide context menu when Esc was pressed\n Escape: (_state, _dispatch, view) => {\n if (this.tooltip.isTooltipOpen) {\n this.tooltip.hide(view!);\n return true;\n }\n return false;\n },\n }),\n handleDOMEvents: {\n mousedown: (view) => {\n const startState: TinyState = {\n doc: view.state.doc,\n selection: view.state.selection,\n };\n this._isMousePressed = true;\n this.cancelTooltipHiding();\n this.tooltip.hide(view);\n\n const onMouseUp = () => {\n if (this.destroyed) return;\n this._isMousePressed = false;\n this.update(view, startState);\n };\n\n document.addEventListener('mouseup', onMouseUp, {once: true});\n },\n },\n };\n }\n\n view(view: EditorView) {\n this.update(view);\n return {\n update: this.update.bind(this),\n destroy: () => {\n this.destroyed = true;\n this.cancelTooltipHiding();\n this.tooltip.destroy();\n },\n };\n }\n\n private update(view: EditorView, prevState?: TinyState) {\n if (this._isMousePressed) return;\n\n this.cancelTooltipHiding();\n\n // Don't show tooltip if editor not mounted to the DOM\n // or when view is out of focus\n if (!view.dom.parentNode || !view.hasFocus()) {\n this.tooltip.hide(view);\n return;\n }\n\n const {state} = view;\n // Don't do anything if the document/selection didn't change\n if (prevState && prevState.doc.eq(state.doc) && prevState.selection.eq(state.selection))\n return;\n\n const {selection} = state;\n // Hide the tooltip if the selection is empty\n if (\n selection.empty ||\n !(selection instanceof TextSelection || selection instanceof AllSelection)\n ) {\n this.tooltip.hide(view);\n return;\n }\n\n // Hide the tooltip when one side of selection inside codeblock\n if (isCodeBlock(selection.$from.parent) || isCodeBlock(selection.$to.parent)) {\n this.tooltip.hide(view);\n return;\n }\n\n this.tooltip.show(view, {\n onOpenChange: (_open, _event, reason) => {\n if (reason !== 'escape-key') this.scheduleTooltipHiding(view);\n },\n });\n }\n\n private scheduleTooltipHiding(view: EditorView) {\n this.hideTimeoutRef = setTimeout(() => {\n // hide tooltip if view is out of focus after 30 ms\n if (!view.hasFocus()) {\n this.tooltip.hide(view);\n }\n }, 30);\n }\n\n private cancelTooltipHiding() {\n if (this.hideTimeoutRef !== null) {\n clearTimeout(this.hideTimeoutRef);\n this.hideTimeoutRef = null;\n }\n }\n}\n"]}
1
+ {"version":3,"file":"index.js","sourceRoot":"../../../../../src","sources":["extensions/behavior/SelectionContext/index.ts"],"names":[],"mappings":"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","sourcesContent":["import {keydownHandler} from 'prosemirror-keymap';\nimport {\n AllSelection,\n type EditorState,\n Plugin,\n type PluginSpec,\n TextSelection,\n} from 'prosemirror-state';\nimport type {EditorProps, EditorView} from 'prosemirror-view';\n\nimport type {ActionStorage, ExtensionAuto} from '../../../core';\nimport type {Logger2} from '../../../logger';\nimport {isCodeBlock} from '../../../utils/nodes';\n\nimport {type ContextConfig, TooltipView} from './tooltip';\n\nexport type {\n ContextConfig as SelectionContextConfig,\n ContextGroupItemData as SelectionContextItemData,\n} from './tooltip';\n\nexport type SelectionContextOptions = {\n config?: ContextConfig;\n};\n\nexport const SelectionContext: ExtensionAuto<SelectionContextOptions> = (builder, {config}) => {\n if (Array.isArray(config) && config.length > 0) {\n builder.addPlugin(\n ({actions}) => new Plugin(new SelectionTooltip(actions, config, builder.logger)),\n );\n }\n};\n\ntype TinyState = Pick<EditorState, 'doc' | 'selection'>;\n\nclass SelectionTooltip implements PluginSpec<unknown> {\n private destroyed = false;\n\n private tooltip: TooltipView;\n private hideTimeoutRef: ReturnType<typeof setTimeout> | null = null;\n\n private _isMousePressed = false;\n\n constructor(actions: ActionStorage, menuConfig: ContextConfig, logger: Logger2.ILogger) {\n this.tooltip = new TooltipView(actions, menuConfig, logger);\n }\n\n get props(): EditorProps {\n return {\n // same as keymap({})\n handleKeyDown: keydownHandler({\n // hide context menu when Esc was pressed\n Escape: (_state, _dispatch, view) => {\n if (this.tooltip.isTooltipOpen) {\n this.tooltip.hide(view!);\n return true;\n }\n return false;\n },\n }),\n handleDOMEvents: {\n mousedown: (view) => {\n const startState: TinyState = {\n doc: view.state.doc,\n selection: view.state.selection,\n };\n this._isMousePressed = true;\n this.cancelTooltipHiding();\n this.tooltip.hide(view);\n\n const onMouseUp = () => {\n if (this.destroyed) return;\n this._isMousePressed = false;\n this.update(view, startState);\n };\n\n document.addEventListener('mouseup', onMouseUp, {once: true});\n },\n },\n };\n }\n\n view(view: EditorView) {\n this.update(view);\n return {\n update: this.update.bind(this),\n destroy: () => {\n this.destroyed = true;\n this.cancelTooltipHiding();\n this.tooltip.destroy();\n },\n };\n }\n\n private update(view: EditorView, prevState?: TinyState) {\n if (this._isMousePressed) return;\n\n this.cancelTooltipHiding();\n\n // Don't show tooltip if editor not mounted to the DOM\n // or when view is out of focus\n if (!view.dom.parentNode || !view.hasFocus()) {\n this.tooltip.hide(view);\n return;\n }\n\n const {state} = view;\n // Don't do anything if the document/selection didn't change\n if (prevState && prevState.doc.eq(state.doc) && prevState.selection.eq(state.selection))\n return;\n\n const {selection} = state;\n // Hide the tooltip if the selection is empty\n if (\n selection.empty ||\n !(selection instanceof TextSelection || selection instanceof AllSelection)\n ) {\n this.tooltip.hide(view);\n return;\n }\n\n // Hide the tooltip when one side of selection inside codeblock\n if (isCodeBlock(selection.$from.parent) || isCodeBlock(selection.$to.parent)) {\n this.tooltip.hide(view);\n return;\n }\n\n this.tooltip.show(view, {\n onOpenChange: (_open, _event, reason) => {\n if (reason !== 'escape-key') this.scheduleTooltipHiding(view);\n },\n });\n }\n\n private scheduleTooltipHiding(view: EditorView) {\n this.hideTimeoutRef = setTimeout(() => {\n // hide tooltip if view is out of focus after 30 ms\n if (!view.hasFocus()) {\n this.tooltip.hide(view);\n }\n }, 30);\n }\n\n private cancelTooltipHiding() {\n if (this.hideTimeoutRef !== null) {\n clearTimeout(this.hideTimeoutRef);\n this.hideTimeoutRef = null;\n }\n }\n}\n"]}
@@ -2,6 +2,7 @@ import { type PopupProps } from '@gravity-ui/uikit';
2
2
  import type { EditorState } from 'prosemirror-state';
3
3
  import type { EditorView } from 'prosemirror-view';
4
4
  import type { ActionStorage } from "../../../core/index.js";
5
+ import { type Logger2 } from "../../../logger.js";
5
6
  import type { ToolbarButtonPopupData, ToolbarGroupItemData, ToolbarSingleItemData } from "../../../toolbar/index.js";
6
7
  export type ContextGroupItemData = (ToolbarGroupItemData<ActionStorage> & {
7
8
  condition?: (state: EditorState) => void;
@@ -12,12 +13,13 @@ export type ContextGroupData = ContextGroupItemData[];
12
13
  export type ContextConfig = ContextGroupData[];
13
14
  export declare class TooltipView {
14
15
  #private;
16
+ private logger;
15
17
  private actions;
16
18
  private menuConfig;
17
19
  private view;
18
20
  private baseProps;
19
21
  private _tooltipRenderItem;
20
- constructor(actions: ActionStorage, menuConfig: ContextConfig);
22
+ constructor(actions: ActionStorage, menuConfig: ContextConfig, logger: Logger2.ILogger);
21
23
  get isTooltipOpen(): boolean;
22
24
  show(view: EditorView, popupProps?: PopupProps): void;
23
25
  hide(view: EditorView): void;
@@ -2,7 +2,7 @@ import { jsx as _jsx } from "react/jsx-runtime";
2
2
  import { offset, shift } from '@floating-ui/react'; // eslint-disable-line import/no-extraneous-dependencies
3
3
  import { Popup } from '@gravity-ui/uikit';
4
4
  import { isFunction } from "../../../lodash.js";
5
- import { logger } from "../../../logger.js";
5
+ import { globalLogger } from "../../../logger.js";
6
6
  import { ErrorLoggerBoundary } from "../../../react-utils/ErrorBoundary.js";
7
7
  import { Toolbar } from "../../../toolbar/index.js";
8
8
  import { getReactRendererFromState } from "../ReactRenderer/index.js";
@@ -13,12 +13,14 @@ const SelectionTooltip = ({ show, poppupProps, ...toolbarProps }) => {
13
13
  };
14
14
  export class TooltipView {
15
15
  #isTooltipOpen = false;
16
+ logger;
16
17
  actions;
17
18
  menuConfig;
18
19
  view;
19
20
  baseProps = { show: false, poppupProps: {} };
20
21
  _tooltipRenderItem = null;
21
- constructor(actions, menuConfig) {
22
+ constructor(actions, menuConfig, logger) {
23
+ this.logger = logger;
22
24
  this.actions = actions;
23
25
  this.menuConfig = menuConfig;
24
26
  }
@@ -53,7 +55,10 @@ export class TooltipView {
53
55
  focus: () => this.view.focus(),
54
56
  data: this.getFilteredConfig(),
55
57
  editor: this.actions,
56
- onClick: (id) => logger.action({ mode: 'wysiwyg', source: 'context-menu', action: id }),
58
+ onClick: (id) => {
59
+ globalLogger.action({ mode: 'wysiwyg', source: 'context-menu', action: id });
60
+ this.logger.action({ source: 'context-menu', action: id });
61
+ },
57
62
  };
58
63
  }
59
64
  getFilteredConfig() {