@gravity-ui/markdown-editor 15.1.0 → 15.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (221) 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/behavior/Autocomplete/handler.d.ts +3 -1
  42. package/build/cjs/extensions/behavior/Autocomplete/handler.js +16 -10
  43. package/build/cjs/extensions/behavior/Autocomplete/handler.js.map +1 -1
  44. package/build/cjs/extensions/behavior/Autocomplete/index.js +1 -1
  45. package/build/cjs/extensions/behavior/Autocomplete/index.js.map +1 -1
  46. package/build/cjs/extensions/behavior/Clipboard/clipboard.d.ts +3 -1
  47. package/build/cjs/extensions/behavior/Clipboard/clipboard.js +31 -3
  48. package/build/cjs/extensions/behavior/Clipboard/clipboard.js.map +1 -1
  49. package/build/cjs/extensions/behavior/Clipboard/index.js +4 -0
  50. package/build/cjs/extensions/behavior/Clipboard/index.js.map +1 -1
  51. package/build/cjs/extensions/behavior/CommandMenu/handler.d.ts +3 -1
  52. package/build/cjs/extensions/behavior/CommandMenu/handler.js +6 -3
  53. package/build/cjs/extensions/behavior/CommandMenu/handler.js.map +1 -1
  54. package/build/cjs/extensions/behavior/CommandMenu/index.js +5 -3
  55. package/build/cjs/extensions/behavior/CommandMenu/index.js.map +1 -1
  56. package/build/cjs/extensions/behavior/EditorModeKeymap/index.js +13 -2
  57. package/build/cjs/extensions/behavior/EditorModeKeymap/index.js.map +1 -1
  58. package/build/cjs/extensions/behavior/FilePaste/index.d.ts +1 -1
  59. package/build/cjs/extensions/behavior/FilePaste/index.js +12 -0
  60. package/build/cjs/extensions/behavior/FilePaste/index.js.map +1 -1
  61. package/build/cjs/extensions/behavior/SelectionContext/index.js +3 -3
  62. package/build/cjs/extensions/behavior/SelectionContext/index.js.map +1 -1
  63. package/build/cjs/extensions/behavior/SelectionContext/tooltip.d.ts +3 -1
  64. package/build/cjs/extensions/behavior/SelectionContext/tooltip.js +7 -2
  65. package/build/cjs/extensions/behavior/SelectionContext/tooltip.js.map +1 -1
  66. package/build/cjs/extensions/behavior/utils/upload.d.ts +2 -0
  67. package/build/cjs/extensions/behavior/utils/upload.js +3 -0
  68. package/build/cjs/extensions/behavior/utils/upload.js.map +1 -1
  69. package/build/cjs/extensions/markdown/Breaks/index.js +2 -1
  70. package/build/cjs/extensions/markdown/Breaks/index.js.map +1 -1
  71. package/build/cjs/extensions/markdown/CodeBlock/CodeBlockHighlight/CodeBlockHighlight.js +2 -1
  72. package/build/cjs/extensions/markdown/CodeBlock/CodeBlockHighlight/CodeBlockHighlight.js.map +1 -1
  73. package/build/cjs/extensions/markdown/Html/index.js +2 -1
  74. package/build/cjs/extensions/markdown/Html/index.js.map +1 -1
  75. package/build/cjs/extensions/markdown/Link/paste-plugin.d.ts +1 -1
  76. package/build/cjs/extensions/markdown/Link/paste-plugin.js +11 -0
  77. package/build/cjs/extensions/markdown/Link/paste-plugin.js.map +1 -1
  78. package/build/cjs/extensions/yfm/ImgSize/ImagePaste/index.d.ts +1 -1
  79. package/build/cjs/extensions/yfm/ImgSize/ImagePaste/index.js +14 -0
  80. package/build/cjs/extensions/yfm/ImgSize/ImagePaste/index.js.map +1 -1
  81. package/build/cjs/extensions/yfm/ImgSize/ImagePaste/upload.js +6 -5
  82. package/build/cjs/extensions/yfm/ImgSize/ImagePaste/upload.js.map +1 -1
  83. package/build/cjs/extensions/yfm/ImgSize/utils.d.ts +2 -1
  84. package/build/cjs/extensions/yfm/ImgSize/utils.js +3 -2
  85. package/build/cjs/extensions/yfm/ImgSize/utils.js.map +1 -1
  86. package/build/cjs/extensions/yfm/YfmFile/YfmFilePaste/index.d.ts +1 -1
  87. package/build/cjs/extensions/yfm/YfmFile/YfmFilePaste/index.js +15 -1
  88. package/build/cjs/extensions/yfm/YfmFile/YfmFilePaste/index.js.map +1 -1
  89. package/build/cjs/i18n/yfm-note/index.d.ts +1 -1
  90. package/build/cjs/logger.d.ts +75 -0
  91. package/build/cjs/logger.js +89 -1
  92. package/build/cjs/logger.js.map +1 -1
  93. package/build/cjs/markup/codemirror/create.d.ts +2 -0
  94. package/build/cjs/markup/codemirror/create.js +15 -4
  95. package/build/cjs/markup/codemirror/create.js.map +1 -1
  96. package/build/cjs/markup/codemirror/files-upload-plugin/plugin.js +13 -0
  97. package/build/cjs/markup/codemirror/files-upload-plugin/plugin.js.map +1 -1
  98. package/build/cjs/markup/codemirror/logger-facet.d.ts +3 -0
  99. package/build/cjs/markup/codemirror/logger-facet.js +9 -0
  100. package/build/cjs/markup/codemirror/logger-facet.js.map +1 -0
  101. package/build/cjs/utils/event-emitter.d.ts +1 -0
  102. package/build/cjs/utils/event-emitter.js +3 -0
  103. package/build/cjs/utils/event-emitter.js.map +1 -1
  104. package/build/cjs/utils/facet.d.ts +1 -0
  105. package/build/cjs/utils/facet.js +33 -0
  106. package/build/cjs/utils/facet.js.map +1 -0
  107. package/build/cjs/utils/keymap.js +7 -2
  108. package/build/cjs/utils/keymap.js.map +1 -1
  109. package/build/cjs/version.js +1 -1
  110. package/build/cjs/version.js.map +1 -1
  111. package/build/esm/bundle/Editor.d.ts +3 -0
  112. package/build/esm/bundle/Editor.js +22 -3
  113. package/build/esm/bundle/Editor.js.map +1 -1
  114. package/build/esm/bundle/MarkdownEditorView.js +3 -2
  115. package/build/esm/bundle/MarkdownEditorView.js.map +1 -1
  116. package/build/esm/bundle/MarkupEditorView.js +7 -2
  117. package/build/esm/bundle/MarkupEditorView.js.map +1 -1
  118. package/build/esm/bundle/MarkupManager.d.ts +3 -6
  119. package/build/esm/bundle/MarkupManager.js +5 -5
  120. package/build/esm/bundle/MarkupManager.js.map +1 -1
  121. package/build/esm/bundle/WysiwygEditorView.js +7 -2
  122. package/build/esm/bundle/WysiwygEditorView.js.map +1 -1
  123. package/build/esm/bundle/types.d.ts +2 -0
  124. package/build/esm/bundle/types.js.map +1 -1
  125. package/build/esm/bundle/useMarkdownEditor.js +5 -3
  126. package/build/esm/bundle/useMarkdownEditor.js.map +1 -1
  127. package/build/esm/core/Editor.d.ts +3 -1
  128. package/build/esm/core/Editor.js +6 -3
  129. package/build/esm/core/Editor.js.map +1 -1
  130. package/build/esm/core/ExtensionBuilder.d.ts +3 -1
  131. package/build/esm/core/ExtensionBuilder.js +6 -1
  132. package/build/esm/core/ExtensionBuilder.js.map +1 -1
  133. package/build/esm/core/ExtensionsManager.d.ts +4 -2
  134. package/build/esm/core/ExtensionsManager.js +6 -5
  135. package/build/esm/core/ExtensionsManager.js.map +1 -1
  136. package/build/esm/core/ParserTokensRegistry.d.ts +6 -0
  137. package/build/esm/core/ParserTokensRegistry.js +9 -1
  138. package/build/esm/core/ParserTokensRegistry.js.map +1 -1
  139. package/build/esm/core/index.d.ts +1 -0
  140. package/build/esm/core/index.js +1 -0
  141. package/build/esm/core/index.js.map +1 -1
  142. package/build/esm/core/markdown/MarkdownParser.d.ts +9 -1
  143. package/build/esm/core/markdown/MarkdownParser.js +7 -3
  144. package/build/esm/core/markdown/MarkdownParser.js.map +1 -1
  145. package/build/esm/core/utils/logger.d.ts +3 -0
  146. package/build/esm/core/utils/logger.js +8 -0
  147. package/build/esm/core/utils/logger.js.map +1 -0
  148. package/build/esm/core/utils/metrics.d.ts +2 -1
  149. package/build/esm/core/utils/metrics.js +8 -2
  150. package/build/esm/core/utils/metrics.js.map +1 -1
  151. package/build/esm/extensions/behavior/Autocomplete/handler.d.ts +3 -1
  152. package/build/esm/extensions/behavior/Autocomplete/handler.js +15 -9
  153. package/build/esm/extensions/behavior/Autocomplete/handler.js.map +1 -1
  154. package/build/esm/extensions/behavior/Autocomplete/index.js +1 -1
  155. package/build/esm/extensions/behavior/Autocomplete/index.js.map +1 -1
  156. package/build/esm/extensions/behavior/Clipboard/clipboard.d.ts +3 -1
  157. package/build/esm/extensions/behavior/Clipboard/clipboard.js +32 -4
  158. package/build/esm/extensions/behavior/Clipboard/clipboard.js.map +1 -1
  159. package/build/esm/extensions/behavior/Clipboard/index.js +4 -0
  160. package/build/esm/extensions/behavior/Clipboard/index.js.map +1 -1
  161. package/build/esm/extensions/behavior/CommandMenu/handler.d.ts +3 -1
  162. package/build/esm/extensions/behavior/CommandMenu/handler.js +7 -4
  163. package/build/esm/extensions/behavior/CommandMenu/handler.js.map +1 -1
  164. package/build/esm/extensions/behavior/CommandMenu/index.js +6 -4
  165. package/build/esm/extensions/behavior/CommandMenu/index.js.map +1 -1
  166. package/build/esm/extensions/behavior/EditorModeKeymap/index.js +13 -2
  167. package/build/esm/extensions/behavior/EditorModeKeymap/index.js.map +1 -1
  168. package/build/esm/extensions/behavior/FilePaste/index.d.ts +1 -1
  169. package/build/esm/extensions/behavior/FilePaste/index.js +12 -0
  170. package/build/esm/extensions/behavior/FilePaste/index.js.map +1 -1
  171. package/build/esm/extensions/behavior/SelectionContext/index.js +3 -3
  172. package/build/esm/extensions/behavior/SelectionContext/index.js.map +1 -1
  173. package/build/esm/extensions/behavior/SelectionContext/tooltip.d.ts +3 -1
  174. package/build/esm/extensions/behavior/SelectionContext/tooltip.js +8 -3
  175. package/build/esm/extensions/behavior/SelectionContext/tooltip.js.map +1 -1
  176. package/build/esm/extensions/behavior/utils/upload.d.ts +2 -0
  177. package/build/esm/extensions/behavior/utils/upload.js +3 -0
  178. package/build/esm/extensions/behavior/utils/upload.js.map +1 -1
  179. package/build/esm/extensions/markdown/Breaks/index.js +3 -2
  180. package/build/esm/extensions/markdown/Breaks/index.js.map +1 -1
  181. package/build/esm/extensions/markdown/CodeBlock/CodeBlockHighlight/CodeBlockHighlight.js +3 -2
  182. package/build/esm/extensions/markdown/CodeBlock/CodeBlockHighlight/CodeBlockHighlight.js.map +1 -1
  183. package/build/esm/extensions/markdown/Html/index.js +3 -2
  184. package/build/esm/extensions/markdown/Html/index.js.map +1 -1
  185. package/build/esm/extensions/markdown/Link/paste-plugin.d.ts +1 -1
  186. package/build/esm/extensions/markdown/Link/paste-plugin.js +11 -0
  187. package/build/esm/extensions/markdown/Link/paste-plugin.js.map +1 -1
  188. package/build/esm/extensions/yfm/ImgSize/ImagePaste/index.d.ts +1 -1
  189. package/build/esm/extensions/yfm/ImgSize/ImagePaste/index.js +14 -0
  190. package/build/esm/extensions/yfm/ImgSize/ImagePaste/index.js.map +1 -1
  191. package/build/esm/extensions/yfm/ImgSize/ImagePaste/upload.js +7 -6
  192. package/build/esm/extensions/yfm/ImgSize/ImagePaste/upload.js.map +1 -1
  193. package/build/esm/extensions/yfm/ImgSize/utils.d.ts +2 -1
  194. package/build/esm/extensions/yfm/ImgSize/utils.js +4 -3
  195. package/build/esm/extensions/yfm/ImgSize/utils.js.map +1 -1
  196. package/build/esm/extensions/yfm/YfmFile/YfmFilePaste/index.d.ts +1 -1
  197. package/build/esm/extensions/yfm/YfmFile/YfmFilePaste/index.js +15 -1
  198. package/build/esm/extensions/yfm/YfmFile/YfmFilePaste/index.js.map +1 -1
  199. package/build/esm/i18n/yfm-note/index.d.ts +1 -1
  200. package/build/esm/logger.d.ts +75 -0
  201. package/build/esm/logger.js +87 -0
  202. package/build/esm/logger.js.map +1 -1
  203. package/build/esm/markup/codemirror/create.d.ts +2 -0
  204. package/build/esm/markup/codemirror/create.js +16 -5
  205. package/build/esm/markup/codemirror/create.js.map +1 -1
  206. package/build/esm/markup/codemirror/files-upload-plugin/plugin.js +13 -0
  207. package/build/esm/markup/codemirror/files-upload-plugin/plugin.js.map +1 -1
  208. package/build/esm/markup/codemirror/logger-facet.d.ts +3 -0
  209. package/build/esm/markup/codemirror/logger-facet.js +6 -0
  210. package/build/esm/markup/codemirror/logger-facet.js.map +1 -0
  211. package/build/esm/utils/event-emitter.d.ts +1 -0
  212. package/build/esm/utils/event-emitter.js +3 -0
  213. package/build/esm/utils/event-emitter.js.map +1 -1
  214. package/build/esm/utils/facet.d.ts +1 -0
  215. package/build/esm/utils/facet.js +29 -0
  216. package/build/esm/utils/facet.js.map +1 -0
  217. package/build/esm/utils/keymap.js +7 -2
  218. package/build/esm/utils/keymap.js.map +1 -1
  219. package/build/esm/version.js +1 -1
  220. package/build/esm/version.js.map +1 -1
  221. package/package.json +1 -1
@@ -1 +1 @@
1
- {"version":3,"file":"tooltip.js","sourceRoot":"../../../../../src","sources":["extensions/behavior/SelectionContext/tooltip.tsx"],"names":[],"mappings":"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","sourcesContent":["import {offset, shift} from '@floating-ui/react'; // eslint-disable-line import/no-extraneous-dependencies\nimport {Popup, type PopupProps} from '@gravity-ui/uikit';\nimport type {EditorState} from 'prosemirror-state';\nimport type {EditorView} from 'prosemirror-view';\n\nimport type {ActionStorage} from '../../../core';\nimport {isFunction} from '../../../lodash';\nimport {logger} from '../../../logger';\nimport {ErrorLoggerBoundary} from '../../../react-utils/ErrorBoundary';\nimport {Toolbar} from '../../../toolbar';\nimport type {\n ToolbarButtonPopupData,\n ToolbarGroupItemData,\n ToolbarProps,\n ToolbarSingleItemData,\n} from '../../../toolbar';\nimport {type RendererItem, getReactRendererFromState} from '../ReactRenderer';\n\ntype SelectionTooltipBaseProps = {\n show?: boolean;\n poppupProps: PopupProps;\n};\ntype SelectionTooltipProps = SelectionTooltipBaseProps & ToolbarProps<ActionStorage>;\n\nconst SelectionTooltip: React.FC<SelectionTooltipProps> = ({\n show,\n poppupProps,\n ...toolbarProps\n}) => {\n if (!show) return null;\n return (\n <Popup open {...poppupProps} style={{padding: '4px 8px'}}>\n <Toolbar {...toolbarProps} />\n </Popup>\n );\n};\n\nexport type ContextGroupItemData =\n | (ToolbarGroupItemData<ActionStorage> & {\n condition?: (state: EditorState) => void;\n })\n | ((ToolbarSingleItemData<ActionStorage> | ToolbarButtonPopupData<ActionStorage>) & {\n condition?: 'enabled';\n });\n\nexport type ContextGroupData = ContextGroupItemData[];\nexport type ContextConfig = ContextGroupData[];\n\nexport class TooltipView {\n #isTooltipOpen = false;\n\n private actions: ActionStorage;\n private menuConfig: ContextConfig;\n\n private view!: EditorView;\n private baseProps: SelectionTooltipBaseProps = {show: false, poppupProps: {}};\n private _tooltipRenderItem: RendererItem | null = null;\n\n constructor(actions: ActionStorage, menuConfig: ContextConfig) {\n this.actions = actions;\n this.menuConfig = menuConfig;\n }\n\n get isTooltipOpen(): boolean {\n return this.#isTooltipOpen;\n }\n\n show(view: EditorView, popupProps?: PopupProps) {\n this.view = view;\n this.#isTooltipOpen = true;\n this.baseProps = {\n show: true,\n poppupProps: {\n ...popupProps,\n ...this.calcPosition(view),\n },\n };\n this.renderPopup();\n }\n\n hide(view: EditorView) {\n this.view = view;\n this.#isTooltipOpen = false;\n this.baseProps = {show: false, poppupProps: {}};\n this.renderPopup();\n }\n\n destroy() {\n this._tooltipRenderItem?.remove();\n this._tooltipRenderItem = null;\n }\n\n private getSelectionTooltipProps(): SelectionTooltipProps {\n return {\n ...this.baseProps,\n focus: () => this.view.focus(),\n data: this.getFilteredConfig(),\n editor: this.actions,\n onClick: (id) => logger.action({mode: 'wysiwyg', source: 'context-menu', action: id}),\n };\n }\n\n private getFilteredConfig(): ContextConfig {\n return this.baseProps.show\n ? this.menuConfig\n .map((groupData) =>\n groupData.filter((item) => {\n const {condition} = item;\n if (condition === 'enabled') {\n return item.isEnable(this.actions);\n }\n if (isFunction(condition)) {\n return condition(this.view.state);\n }\n return true;\n }),\n )\n .filter((groupData) => Boolean(groupData.length))\n : [];\n }\n\n private renderPopup() {\n this.tooltipRenderItem.rerender();\n }\n\n private get tooltipRenderItem() {\n if (!this._tooltipRenderItem) {\n const reactRenderer = getReactRendererFromState(this.view.state);\n this._tooltipRenderItem = reactRenderer.createItem('selection_context', () => (\n <ErrorLoggerBoundary>\n <SelectionTooltip {...this.getSelectionTooltipProps()} />\n </ErrorLoggerBoundary>\n ));\n }\n return this._tooltipRenderItem;\n }\n\n private calcPosition(view: EditorView): PopupProps {\n const viewDom = view.dom as Element;\n // The box in which the tooltip is positioned, to use as base\n const viewBox = viewDom.getBoundingClientRect();\n\n const viewWidth = viewBox.right - viewBox.left;\n const viewHalfWidth = viewWidth / 2;\n\n // These are in screen coordinates\n const start = view.coordsAtPos(view.state.selection.from);\n const end = view.coordsAtPos(view.state.selection.to);\n\n // Find a center-ish x position from the selection endpoints (when\n // crossing lines, end may be more to the left)\n const left = Math.max((start.left + end.left) / 2, start.left + 3);\n\n const leftOffset = left - (viewBox.left + viewHalfWidth);\n const bottomOffset = -(viewBox.bottom - end.bottom) + this.popupTextOffset;\n\n return {\n placement: 'bottom',\n anchorElement: viewDom,\n // override floating middlewares\n floatingMiddlewares: [\n offset({\n mainAxis: bottomOffset,\n crossAxis: leftOffset,\n }),\n shift({\n mainAxis: true,\n crossAxis: false,\n padding: 4,\n }),\n ],\n };\n }\n\n private get popupTextOffset() {\n return 4; // 4px offset from text selection\n }\n}\n"]}
1
+ {"version":3,"file":"tooltip.js","sourceRoot":"../../../../../src","sources":["extensions/behavior/SelectionContext/tooltip.tsx"],"names":[],"mappings":"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","sourcesContent":["import {offset, shift} from '@floating-ui/react'; // eslint-disable-line import/no-extraneous-dependencies\nimport {Popup, type PopupProps} from '@gravity-ui/uikit';\nimport type {EditorState} from 'prosemirror-state';\nimport type {EditorView} from 'prosemirror-view';\n\nimport type {ActionStorage} from '../../../core';\nimport {isFunction} from '../../../lodash';\nimport {type Logger2, globalLogger} from '../../../logger';\nimport {ErrorLoggerBoundary} from '../../../react-utils/ErrorBoundary';\nimport {Toolbar} from '../../../toolbar';\nimport type {\n ToolbarButtonPopupData,\n ToolbarGroupItemData,\n ToolbarProps,\n ToolbarSingleItemData,\n} from '../../../toolbar';\nimport {type RendererItem, getReactRendererFromState} from '../ReactRenderer';\n\ntype SelectionTooltipBaseProps = {\n show?: boolean;\n poppupProps: PopupProps;\n};\ntype SelectionTooltipProps = SelectionTooltipBaseProps & ToolbarProps<ActionStorage>;\n\nconst SelectionTooltip: React.FC<SelectionTooltipProps> = ({\n show,\n poppupProps,\n ...toolbarProps\n}) => {\n if (!show) return null;\n return (\n <Popup open {...poppupProps} style={{padding: '4px 8px'}}>\n <Toolbar {...toolbarProps} />\n </Popup>\n );\n};\n\nexport type ContextGroupItemData =\n | (ToolbarGroupItemData<ActionStorage> & {\n condition?: (state: EditorState) => void;\n })\n | ((ToolbarSingleItemData<ActionStorage> | ToolbarButtonPopupData<ActionStorage>) & {\n condition?: 'enabled';\n });\n\nexport type ContextGroupData = ContextGroupItemData[];\nexport type ContextConfig = ContextGroupData[];\n\nexport class TooltipView {\n #isTooltipOpen = false;\n\n private logger: Logger2.ILogger;\n private actions: ActionStorage;\n private menuConfig: ContextConfig;\n\n private view!: EditorView;\n private baseProps: SelectionTooltipBaseProps = {show: false, poppupProps: {}};\n private _tooltipRenderItem: RendererItem | null = null;\n\n constructor(actions: ActionStorage, menuConfig: ContextConfig, logger: Logger2.ILogger) {\n this.logger = logger;\n this.actions = actions;\n this.menuConfig = menuConfig;\n }\n\n get isTooltipOpen(): boolean {\n return this.#isTooltipOpen;\n }\n\n show(view: EditorView, popupProps?: PopupProps) {\n this.view = view;\n this.#isTooltipOpen = true;\n this.baseProps = {\n show: true,\n poppupProps: {\n ...popupProps,\n ...this.calcPosition(view),\n },\n };\n this.renderPopup();\n }\n\n hide(view: EditorView) {\n this.view = view;\n this.#isTooltipOpen = false;\n this.baseProps = {show: false, poppupProps: {}};\n this.renderPopup();\n }\n\n destroy() {\n this._tooltipRenderItem?.remove();\n this._tooltipRenderItem = null;\n }\n\n private getSelectionTooltipProps(): SelectionTooltipProps {\n return {\n ...this.baseProps,\n focus: () => this.view.focus(),\n data: this.getFilteredConfig(),\n editor: this.actions,\n onClick: (id) => {\n globalLogger.action({mode: 'wysiwyg', source: 'context-menu', action: id});\n this.logger.action({source: 'context-menu', action: id});\n },\n };\n }\n\n private getFilteredConfig(): ContextConfig {\n return this.baseProps.show\n ? this.menuConfig\n .map((groupData) =>\n groupData.filter((item) => {\n const {condition} = item;\n if (condition === 'enabled') {\n return item.isEnable(this.actions);\n }\n if (isFunction(condition)) {\n return condition(this.view.state);\n }\n return true;\n }),\n )\n .filter((groupData) => Boolean(groupData.length))\n : [];\n }\n\n private renderPopup() {\n this.tooltipRenderItem.rerender();\n }\n\n private get tooltipRenderItem() {\n if (!this._tooltipRenderItem) {\n const reactRenderer = getReactRendererFromState(this.view.state);\n this._tooltipRenderItem = reactRenderer.createItem('selection_context', () => (\n <ErrorLoggerBoundary>\n <SelectionTooltip {...this.getSelectionTooltipProps()} />\n </ErrorLoggerBoundary>\n ));\n }\n return this._tooltipRenderItem;\n }\n\n private calcPosition(view: EditorView): PopupProps {\n const viewDom = view.dom as Element;\n // The box in which the tooltip is positioned, to use as base\n const viewBox = viewDom.getBoundingClientRect();\n\n const viewWidth = viewBox.right - viewBox.left;\n const viewHalfWidth = viewWidth / 2;\n\n // These are in screen coordinates\n const start = view.coordsAtPos(view.state.selection.from);\n const end = view.coordsAtPos(view.state.selection.to);\n\n // Find a center-ish x position from the selection endpoints (when\n // crossing lines, end may be more to the left)\n const left = Math.max((start.left + end.left) / 2, start.left + 3);\n\n const leftOffset = left - (viewBox.left + viewHalfWidth);\n const bottomOffset = -(viewBox.bottom - end.bottom) + this.popupTextOffset;\n\n return {\n placement: 'bottom',\n anchorElement: viewDom,\n // override floating middlewares\n floatingMiddlewares: [\n offset({\n mainAxis: bottomOffset,\n crossAxis: leftOffset,\n }),\n shift({\n mainAxis: true,\n crossAxis: false,\n padding: 4,\n }),\n ],\n };\n }\n\n private get popupTextOffset() {\n return 4; // 4px offset from text selection\n }\n}\n"]}
@@ -1,11 +1,13 @@
1
1
  import type { Node } from 'prosemirror-model';
2
2
  import type { EditorView } from 'prosemirror-view';
3
+ import type { Logger2 } from "../../../logger.js";
3
4
  import { type FileUploadHandler, type UploadSuccessItem } from "../../../utils/upload.js";
4
5
  import type { WidgetDescriptor } from "../WidgetDecoration/index.js";
5
6
  export declare abstract class FilesBatchUploadProcess {
6
7
  protected readonly view: EditorView;
7
8
  protected readonly files: readonly File[];
8
9
  protected readonly uploadHandler: FileUploadHandler;
10
+ protected readonly logger: Logger2.ILogger;
9
11
  protected skeletonDescriptor?: WidgetDescriptor;
10
12
  constructor(view: EditorView, files: readonly File[], uploadHandler: FileUploadHandler);
11
13
  run(): Promise<void>;
@@ -1,13 +1,16 @@
1
+ import { getLoggerFromState } from "../../../core/index.js";
1
2
  import { batchUploadFiles, } from "../../../utils/upload.js";
2
3
  export class FilesBatchUploadProcess {
3
4
  view;
4
5
  files;
5
6
  uploadHandler;
7
+ logger;
6
8
  skeletonDescriptor;
7
9
  constructor(view, files, uploadHandler) {
8
10
  this.view = view;
9
11
  this.files = files;
10
12
  this.uploadHandler = uploadHandler;
13
+ this.logger = getLoggerFromState(view.state);
11
14
  }
12
15
  async run() {
13
16
  await this.insertSkeleton();
@@ -1 +1 @@
1
- {"version":3,"file":"upload.js","sourceRoot":"../../../../../src","sources":["extensions/behavior/utils/upload.ts"],"names":[],"mappings":"AAGA,OAAO,EAGH,gBAAgB,GACnB,iCAA8B;AAG/B,MAAM,OAAgB,uBAAuB;IACtB,IAAI,CAAC;IACL,KAAK,CAAC;IACN,aAAa,CAAC;IAEvB,kBAAkB,CAAoB;IAEhD,YAAY,IAAgB,EAAE,KAAsB,EAAE,aAAgC;QAClF,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC;QACjB,IAAI,CAAC,KAAK,GAAG,KAAK,CAAC;QACnB,IAAI,CAAC,aAAa,GAAG,aAAa,CAAC;IACvC,CAAC;IAED,KAAK,CAAC,GAAG;QACL,MAAM,IAAI,CAAC,cAAc,EAAE,CAAC;QAC5B,MAAM,IAAI,CAAC,WAAW,EAAE,CAAC;QACzB,IAAI,CAAC,cAAc,EAAE,CAAC;IAC1B,CAAC;IAES,KAAK,CAAC,cAAc;QAC1B,MAAM,EAAC,IAAI,EAAC,GAAG,IAAI,CAAC;QACpB,MAAM,EAAC,KAAK,EAAC,GAAG,IAAI,CAAC;QACrB,IAAI,CAAC,kBAAkB,GAAG,MAAM,IAAI,CAAC,cAAc,EAAE,CAAC;QACtD,IAAI,EAAE,GAAG,KAAK,CAAC,EAAE,CAAC;QAClB,IAAI,CAAC,KAAK,CAAC,SAAS,CAAC,KAAK;YAAE,EAAE,GAAG,EAAE,CAAC,eAAe,EAAE,CAAC;QACtD,EAAE,GAAG,IAAI,CAAC,kBAAkB,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;QACzC,IAAI,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC;IACtB,CAAC;IAIS,KAAK,CAAC,WAAW;QACvB,MAAM,WAAW,GAAoB,EAAE,CAAC;QACxC,MAAM,gBAAgB,CAAC,IAAI,CAAC,KAAK,EAAE,IAAI,CAAC,aAAa,EAAE,CAAC,GAAG,EAAE,EAAE;YAC3D,WAAW,CAAC,IAAI,CACZ,CAAC,KAAK,IAAI,EAAE;gBACR,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,CAAC;gBAC1C,MAAM,EAAC,IAAI,EAAC,GAAG,IAAI,CAAC;gBACpB,MAAM,EAAC,MAAM,EAAC,GAAG,IAAI,CAAC,KAAK,CAAC;gBAC5B,IAAI,CAAC,QAAQ,CACT,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,MAAM,CAAC,IAAI,CAAC,kBAAmB,CAAC,GAAG,EAAE;oBAC/C,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC;oBAChB,IAAI;oBACJ,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC;iBACnB,CAAC,CACL,CAAC;YACN,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,CAC5B,CAAC;QACN,CAAC,CAAC,CAAC;QACH,MAAM,OAAO,CAAC,UAAU,CAAC,WAAW,CAAC,CAAC;IAC1C,CAAC;IAIS,cAAc;QACpB,MAAM,EAAC,IAAI,EAAC,GAAG,IAAI,CAAC;QACpB,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,kBAAmB,CAAC,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC,CAAC;IAClE,CAAC;CACJ","sourcesContent":["import type {Node} from 'prosemirror-model';\nimport type {EditorView} from 'prosemirror-view';\n\nimport {\n type FileUploadHandler,\n type UploadSuccessItem,\n batchUploadFiles,\n} from '../../../utils/upload';\nimport type {WidgetDescriptor} from '../WidgetDecoration';\n\nexport abstract class FilesBatchUploadProcess {\n protected readonly view;\n protected readonly files;\n protected readonly uploadHandler;\n\n protected skeletonDescriptor?: WidgetDescriptor;\n\n constructor(view: EditorView, files: readonly File[], uploadHandler: FileUploadHandler) {\n this.view = view;\n this.files = files;\n this.uploadHandler = uploadHandler;\n }\n\n async run() {\n await this.insertSkeleton();\n await this.batchUpload();\n this.removeSkeleton();\n }\n\n protected async insertSkeleton() {\n const {view} = this;\n const {state} = view;\n this.skeletonDescriptor = await this.createSkeleton();\n let tr = state.tr;\n if (!state.selection.empty) tr = tr.deleteSelection();\n tr = this.skeletonDescriptor.applyTo(tr);\n view.dispatch(tr);\n }\n\n protected abstract createSkeleton(): WidgetDescriptor | Promise<WidgetDescriptor>;\n\n protected async batchUpload() {\n const insertQueue: Promise<void>[] = [];\n await batchUploadFiles(this.files, this.uploadHandler, (res) => {\n insertQueue.push(\n (async () => {\n const node = await this.createPMNode(res);\n const {view} = this;\n const {schema} = view.state;\n view.dispatch(\n view.state.tr.insert(this.skeletonDescriptor!.pos, [\n schema.text(' '),\n node,\n schema.text(' '),\n ]),\n );\n })().catch(console.error),\n );\n });\n await Promise.allSettled(insertQueue);\n }\n\n protected abstract createPMNode(res: UploadSuccessItem): Promise<Node>;\n\n protected removeSkeleton() {\n const {view} = this;\n view.dispatch(this.skeletonDescriptor!.rmDeco(view.state.tr));\n }\n}\n"]}
1
+ {"version":3,"file":"upload.js","sourceRoot":"../../../../../src","sources":["extensions/behavior/utils/upload.ts"],"names":[],"mappings":"AAGA,OAAO,EAAC,kBAAkB,EAAC,+BAAsB;AAEjD,OAAO,EAGH,gBAAgB,GACnB,iCAA8B;AAG/B,MAAM,OAAgB,uBAAuB;IACtB,IAAI,CAAC;IACL,KAAK,CAAC;IACN,aAAa,CAAC;IACd,MAAM,CAAkB;IAEjC,kBAAkB,CAAoB;IAEhD,YAAY,IAAgB,EAAE,KAAsB,EAAE,aAAgC;QAClF,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC;QACjB,IAAI,CAAC,KAAK,GAAG,KAAK,CAAC;QACnB,IAAI,CAAC,aAAa,GAAG,aAAa,CAAC;QACnC,IAAI,CAAC,MAAM,GAAG,kBAAkB,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IACjD,CAAC;IAED,KAAK,CAAC,GAAG;QACL,MAAM,IAAI,CAAC,cAAc,EAAE,CAAC;QAC5B,MAAM,IAAI,CAAC,WAAW,EAAE,CAAC;QACzB,IAAI,CAAC,cAAc,EAAE,CAAC;IAC1B,CAAC;IAES,KAAK,CAAC,cAAc;QAC1B,MAAM,EAAC,IAAI,EAAC,GAAG,IAAI,CAAC;QACpB,MAAM,EAAC,KAAK,EAAC,GAAG,IAAI,CAAC;QACrB,IAAI,CAAC,kBAAkB,GAAG,MAAM,IAAI,CAAC,cAAc,EAAE,CAAC;QACtD,IAAI,EAAE,GAAG,KAAK,CAAC,EAAE,CAAC;QAClB,IAAI,CAAC,KAAK,CAAC,SAAS,CAAC,KAAK;YAAE,EAAE,GAAG,EAAE,CAAC,eAAe,EAAE,CAAC;QACtD,EAAE,GAAG,IAAI,CAAC,kBAAkB,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;QACzC,IAAI,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC;IACtB,CAAC;IAIS,KAAK,CAAC,WAAW;QACvB,MAAM,WAAW,GAAoB,EAAE,CAAC;QACxC,MAAM,gBAAgB,CAAC,IAAI,CAAC,KAAK,EAAE,IAAI,CAAC,aAAa,EAAE,CAAC,GAAG,EAAE,EAAE;YAC3D,WAAW,CAAC,IAAI,CACZ,CAAC,KAAK,IAAI,EAAE;gBACR,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,CAAC;gBAC1C,MAAM,EAAC,IAAI,EAAC,GAAG,IAAI,CAAC;gBACpB,MAAM,EAAC,MAAM,EAAC,GAAG,IAAI,CAAC,KAAK,CAAC;gBAC5B,IAAI,CAAC,QAAQ,CACT,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,MAAM,CAAC,IAAI,CAAC,kBAAmB,CAAC,GAAG,EAAE;oBAC/C,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC;oBAChB,IAAI;oBACJ,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC;iBACnB,CAAC,CACL,CAAC;YACN,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,CAC5B,CAAC;QACN,CAAC,CAAC,CAAC;QACH,MAAM,OAAO,CAAC,UAAU,CAAC,WAAW,CAAC,CAAC;IAC1C,CAAC;IAIS,cAAc;QACpB,MAAM,EAAC,IAAI,EAAC,GAAG,IAAI,CAAC;QACpB,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,kBAAmB,CAAC,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC,CAAC;IAClE,CAAC;CACJ","sourcesContent":["import type {Node} from 'prosemirror-model';\nimport type {EditorView} from 'prosemirror-view';\n\nimport {getLoggerFromState} from '../../../core';\nimport type {Logger2} from '../../../logger';\nimport {\n type FileUploadHandler,\n type UploadSuccessItem,\n batchUploadFiles,\n} from '../../../utils/upload';\nimport type {WidgetDescriptor} from '../WidgetDecoration';\n\nexport abstract class FilesBatchUploadProcess {\n protected readonly view;\n protected readonly files;\n protected readonly uploadHandler;\n protected readonly logger: Logger2.ILogger;\n\n protected skeletonDescriptor?: WidgetDescriptor;\n\n constructor(view: EditorView, files: readonly File[], uploadHandler: FileUploadHandler) {\n this.view = view;\n this.files = files;\n this.uploadHandler = uploadHandler;\n this.logger = getLoggerFromState(view.state);\n }\n\n async run() {\n await this.insertSkeleton();\n await this.batchUpload();\n this.removeSkeleton();\n }\n\n protected async insertSkeleton() {\n const {view} = this;\n const {state} = view;\n this.skeletonDescriptor = await this.createSkeleton();\n let tr = state.tr;\n if (!state.selection.empty) tr = tr.deleteSelection();\n tr = this.skeletonDescriptor.applyTo(tr);\n view.dispatch(tr);\n }\n\n protected abstract createSkeleton(): WidgetDescriptor | Promise<WidgetDescriptor>;\n\n protected async batchUpload() {\n const insertQueue: Promise<void>[] = [];\n await batchUploadFiles(this.files, this.uploadHandler, (res) => {\n insertQueue.push(\n (async () => {\n const node = await this.createPMNode(res);\n const {view} = this;\n const {schema} = view.state;\n view.dispatch(\n view.state.tr.insert(this.skeletonDescriptor!.pos, [\n schema.text(' '),\n node,\n schema.text(' '),\n ]),\n );\n })().catch(console.error),\n );\n });\n await Promise.allSettled(insertQueue);\n }\n\n protected abstract createPMNode(res: UploadSuccessItem): Promise<Node>;\n\n protected removeSkeleton() {\n const {view} = this;\n view.dispatch(this.skeletonDescriptor!.rmDeco(view.state.tr));\n }\n}\n"]}
@@ -1,6 +1,6 @@
1
1
  import { chainCommands, exitCode } from 'prosemirror-commands';
2
2
  import { TextSelection } from 'prosemirror-state';
3
- import { logger } from "../../../logger.js";
3
+ import { globalLogger } from "../../../logger.js";
4
4
  import { isMac } from "../../../utils/platform.js";
5
5
  import { isTextSelection } from "../../../utils/selection.js";
6
6
  import { pType } from "../../base/BaseSchema/BaseSchemaSpecs/index.js";
@@ -13,7 +13,8 @@ export const Breaks = (builder, opts) => {
13
13
  }
14
14
  else {
15
15
  preferredBreak = opts.preferredBreak ?? 'hard';
16
- logger.info("[Breaks extension]: Parameter 'breaks' is not defined in context; value from options is used");
16
+ globalLogger.info("[Breaks extension]: Parameter 'breaks' is not defined in context; value from options is used");
17
+ builder.logger.log("[Breaks extension]: Parameter 'breaks' is not defined in context; value from options is used");
17
18
  }
18
19
  builder.use(BreaksSpecs, { preferredBreak });
19
20
  builder.addKeymap(({ schema }) => {
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"../../../../../src","sources":["extensions/markdown/Breaks/index.ts"],"names":[],"mappings":"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","sourcesContent":["import {chainCommands, exitCode} from 'prosemirror-commands';\nimport type {Node, NodeType} from 'prosemirror-model';\nimport {TextSelection} from 'prosemirror-state';\n\nimport type {ExtensionAuto, Keymap} from '../../../core';\nimport {logger} from '../../../logger';\nimport {isMac} from '../../../utils/platform';\nimport {isTextSelection} from '../../../utils/selection';\nimport {pType} from '../../base/BaseSchema/BaseSchemaSpecs';\n\nimport {BreaksSpecs, type BreaksSpecsOptions, hbType, sbType} from './BreaksSpecs';\n\nexport {BreaksSpecs, BreakNodeName, hbType, sbType} from './BreaksSpecs';\n\nexport type BreaksOptions = {\n /**\n * This option is used if the 'breaks' parameter is not specified via the context\n * @default 'hard'\n */\n // TODO: [context] make this deprecated\n preferredBreak?: 'hard' | 'soft';\n};\n\nexport const Breaks: ExtensionAuto<BreaksOptions> = (builder, opts) => {\n let preferredBreak: 'hard' | 'soft';\n if (builder.context.has('breaks')) {\n preferredBreak = builder.context.get('breaks') ? 'soft' : 'hard';\n } else {\n preferredBreak = opts.preferredBreak ?? 'hard';\n logger.info(\n \"[Breaks extension]: Parameter 'breaks' is not defined in context; value from options is used\",\n );\n }\n\n builder.use<BreaksSpecsOptions>(BreaksSpecs, {preferredBreak});\n\n builder.addKeymap(({schema}) => {\n const cmd = addBr((preferredBreak === 'soft' ? sbType : hbType)(schema));\n const keys: Keymap = {\n 'Shift-Enter': cmd,\n };\n\n if (isMac()) {\n keys['Ctrl-Enter'] = cmd;\n }\n\n return keys;\n });\n};\n\nconst addBr = (br: NodeType) =>\n chainCommands(exitCode, (state, dispatch) => {\n const {selection: sel, schema} = state;\n if (\n !isTextSelection(sel) ||\n !sel.empty ||\n // breaks can only be in the paragraph\n sel.$cursor?.parent.type !== pType(schema)\n )\n return false;\n\n if (isBreakNode(sel.$cursor.nodeBefore)) {\n if (dispatch) {\n const {\n $cursor,\n $cursor: {pos},\n } = sel;\n const from = isBreakNode($cursor.nodeAfter) ? pos + 1 : pos;\n const posEnd = $cursor.end();\n const posAfter = $cursor.after();\n\n const contentAfter = state.doc.slice(from, posEnd, false).content;\n\n let tr = state.tr.insert(posAfter, pType(schema).create(null, contentAfter));\n tr = tr\n .setSelection(TextSelection.create(tr.doc, posAfter + 1))\n .scrollIntoView()\n .delete(pos, posEnd) // remove content after current pos (it's moved to next para)\n .delete(pos - 1, pos); // remove break before current pos ($cursor.nodeBefore)\n dispatch(tr);\n }\n return true;\n }\n\n dispatch?.(state.tr.replaceSelectionWith(br.create()).scrollIntoView());\n return true;\n });\n\ndeclare global {\n namespace WysiwygEditor {\n interface Context {\n /**\n * Same as @type {MarkdownIt.Options.breaks}\n */\n breaks: boolean;\n }\n }\n}\n\nfunction isBreakNode(node?: Node | null | undefined): boolean {\n return Boolean(node?.type.spec.isBreak);\n}\n"]}
1
+ {"version":3,"file":"index.js","sourceRoot":"../../../../../src","sources":["extensions/markdown/Breaks/index.ts"],"names":[],"mappings":"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","sourcesContent":["import {chainCommands, exitCode} from 'prosemirror-commands';\nimport type {Node, NodeType} from 'prosemirror-model';\nimport {TextSelection} from 'prosemirror-state';\n\nimport type {ExtensionAuto, Keymap} from '../../../core';\nimport {globalLogger} from '../../../logger';\nimport {isMac} from '../../../utils/platform';\nimport {isTextSelection} from '../../../utils/selection';\nimport {pType} from '../../base/BaseSchema/BaseSchemaSpecs';\n\nimport {BreaksSpecs, type BreaksSpecsOptions, hbType, sbType} from './BreaksSpecs';\n\nexport {BreaksSpecs, BreakNodeName, hbType, sbType} from './BreaksSpecs';\n\nexport type BreaksOptions = {\n /**\n * This option is used if the 'breaks' parameter is not specified via the context\n * @default 'hard'\n */\n // TODO: [context] make this deprecated\n preferredBreak?: 'hard' | 'soft';\n};\n\nexport const Breaks: ExtensionAuto<BreaksOptions> = (builder, opts) => {\n let preferredBreak: 'hard' | 'soft';\n if (builder.context.has('breaks')) {\n preferredBreak = builder.context.get('breaks') ? 'soft' : 'hard';\n } else {\n preferredBreak = opts.preferredBreak ?? 'hard';\n globalLogger.info(\n \"[Breaks extension]: Parameter 'breaks' is not defined in context; value from options is used\",\n );\n builder.logger.log(\n \"[Breaks extension]: Parameter 'breaks' is not defined in context; value from options is used\",\n );\n }\n\n builder.use<BreaksSpecsOptions>(BreaksSpecs, {preferredBreak});\n\n builder.addKeymap(({schema}) => {\n const cmd = addBr((preferredBreak === 'soft' ? sbType : hbType)(schema));\n const keys: Keymap = {\n 'Shift-Enter': cmd,\n };\n\n if (isMac()) {\n keys['Ctrl-Enter'] = cmd;\n }\n\n return keys;\n });\n};\n\nconst addBr = (br: NodeType) =>\n chainCommands(exitCode, (state, dispatch) => {\n const {selection: sel, schema} = state;\n if (\n !isTextSelection(sel) ||\n !sel.empty ||\n // breaks can only be in the paragraph\n sel.$cursor?.parent.type !== pType(schema)\n )\n return false;\n\n if (isBreakNode(sel.$cursor.nodeBefore)) {\n if (dispatch) {\n const {\n $cursor,\n $cursor: {pos},\n } = sel;\n const from = isBreakNode($cursor.nodeAfter) ? pos + 1 : pos;\n const posEnd = $cursor.end();\n const posAfter = $cursor.after();\n\n const contentAfter = state.doc.slice(from, posEnd, false).content;\n\n let tr = state.tr.insert(posAfter, pType(schema).create(null, contentAfter));\n tr = tr\n .setSelection(TextSelection.create(tr.doc, posAfter + 1))\n .scrollIntoView()\n .delete(pos, posEnd) // remove content after current pos (it's moved to next para)\n .delete(pos - 1, pos); // remove break before current pos ($cursor.nodeBefore)\n dispatch(tr);\n }\n return true;\n }\n\n dispatch?.(state.tr.replaceSelectionWith(br.create()).scrollIntoView());\n return true;\n });\n\ndeclare global {\n namespace WysiwygEditor {\n interface Context {\n /**\n * Same as @type {MarkdownIt.Options.breaks}\n */\n breaks: boolean;\n }\n }\n}\n\nfunction isBreakNode(node?: Node | null | undefined): boolean {\n return Boolean(node?.type.spec.isBreak);\n}\n"]}
@@ -3,7 +3,7 @@ import { Plugin, PluginKey } from 'prosemirror-state';
3
3
  import { findChildrenByType } from 'prosemirror-utils';
4
4
  import { Decoration, DecorationSet } from 'prosemirror-view';
5
5
  import { capitalize } from "../../../../lodash.js";
6
- import { logger } from "../../../../logger.js";
6
+ import { globalLogger } from "../../../../logger.js";
7
7
  import { CodeBlockNodeAttr, codeBlockNodeName, codeBlockType } from "../CodeBlockSpecs/index.js";
8
8
  import { codeLangSelectTooltipViewCreator } from "./TooltipPlugin/index.js";
9
9
  const key = new PluginKey('code_block_highlight');
@@ -20,7 +20,8 @@ export const CodeBlockHighlight = (builder, opts) => {
20
20
  lowlight = create(langs);
21
21
  }
22
22
  catch (e) {
23
- logger.info('Skip code_block highlighting');
23
+ globalLogger.info('Skip code_block highlighting');
24
+ builder.logger.log('Skip code_block highlighting');
24
25
  return;
25
26
  }
26
27
  builder.addPlugin(() => {
@@ -1 +1 @@
1
- {"version":3,"file":"CodeBlockHighlight.js","sourceRoot":"../../../../../../src","sources":["extensions/markdown/CodeBlock/CodeBlockHighlight/CodeBlockHighlight.ts"],"names":[],"mappings":"AAKA,OAAO,EAAC,MAAM,EAAE,SAAS,EAAC,MAAM,mBAAmB,CAAC;AAEpD,oCAAoC;AACpC,OAAO,EAAC,kBAAkB,EAAC,MAAM,mBAAmB,CAAC;AACrD,OAAO,EAAC,UAAU,EAAE,aAAa,EAAC,MAAM,kBAAkB,CAAC;AAG3D,OAAO,EAAC,UAAU,EAAC,8BAA2B;AAC9C,OAAO,EAAC,MAAM,EAAC,8BAA2B;AAC1C,OAAO,EAAC,iBAAiB,EAAE,iBAAiB,EAAE,aAAa,EAAC,mCAA0B;AAEtF,OAAO,EAAC,gCAAgC,EAAC,iCAAwB;AAYjE,MAAM,GAAG,GAAG,IAAI,SAAS,CAAgB,sBAAsB,CAAC,CAAC;AAMjE,MAAM,CAAC,MAAM,kBAAkB,GAA6C,CAAC,OAAO,EAAE,IAAI,EAAE,EAAE;IAC1F,IAAI,KAAoC,CAAC;IACzC,IAAI,QAAkB,CAAC;IACvB,IAAI,IAAiB,CAAC;IAEtB,IAAI,CAAC;QACD,IAAI,GAAG,OAAO,CAAC,uBAAuB,CAAC,CAAC;QACxC,MAAM,GAAG,GAAG,OAAO,CAAC,UAAU,CAAC,CAAC;QAChC,MAAM,GAAG,GAAqB,GAAG,CAAC,GAAG,CAAC;QACtC,MAAM,MAAM,GAA0B,GAAG,CAAC,cAAc,CAAC;QACzD,KAAK,GAAG,EAAC,GAAG,GAAG,EAAE,GAAG,IAAI,CAAC,KAAK,EAAC,CAAC;QAChC,QAAQ,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC;IAC7B,CAAC;IAAC,OAAO,CAAC,EAAE,CAAC;QACT,MAAM,CAAC,IAAI,CAAC,8BAA8B,CAAC,CAAC;QAC5C,OAAO;IACX,CAAC;IAED,OAAO,CAAC,SAAS,CAAC,GAAG,EAAE;QACnB,MAAM,WAAW,GAAqB,EAAE,CAAC;QACzC,MAAM,OAAO,GAA2B,EAAE,CAAC;QAC3C,KAAK,MAAM,IAAI,IAAI,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC;YACpC,MAAM,IAAI,GAAG,KAAK,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,CAAC;YAC/B,WAAW,CAAC,IAAI,CAAC;gBACb,KAAK,EAAE,IAAI;gBACX,OAAO,EAAE,IAAI,CAAC,IAAI,IAAI,UAAU,CAAC,IAAI,CAAC;aACzC,CAAC,CAAC;YACH,IAAI,IAAI,CAAC,OAAO,EAAE,CAAC;gBACf,KAAK,MAAM,KAAK,IAAI,IAAI,CAAC,OAAO,EAAE,CAAC;oBAC/B,OAAO,CAAC,KAAK,CAAC,GAAG,IAAI,CAAC;gBAC1B,CAAC;YACL,CAAC;QACL,CAAC;QAED,4BAA4B;QAC5B,2CAA2C;QAC3C,OAAO,IAAI,MAAM,CAAgB;YAC7B,GAAG;YACH,KAAK,EAAE;gBACH,IAAI,EAAE,CAAC,CAAC,EAAE,KAAK,EAAE,EAAE,CAAC,cAAc,CAAC,KAAK,CAAC,GAAG,CAAC;gBAC7C,KAAK,EAAE,CAAC,EAAE,EAAE,KAAK,EAAE,QAAQ,EAAE,QAAQ,EAAE,EAAE;oBACrC,IAAI,EAAE,CAAC,UAAU,EAAE,CAAC;wBAChB,MAAM,WAAW,GAAG,QAAQ,CAAC,SAAS,CAAC,KAAK,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC;wBAC9D,MAAM,WAAW,GAAG,QAAQ,CAAC,SAAS,CAAC,KAAK,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC;wBAE9D,wBAAwB;wBACxB,IACI,WAAW,KAAK,iBAAiB;4BACjC,WAAW,KAAK,iBAAiB,EACnC,CAAC;4BACC,qCAAqC;4BACrC,OAAO,cAAc,CAAC,EAAE,CAAC,GAAG,CAAC,CAAC;wBAClC,CAAC;6BAAM,CAAC;4BACJ,MAAM,QAAQ,GAAG,kBAAkB,CAC/B,QAAQ,CAAC,GAAG,EACZ,aAAa,CAAC,QAAQ,CAAC,MAAM,CAAC,CACjC,CAAC;4BACF,MAAM,QAAQ,GAAG,kBAAkB,CAC/B,QAAQ,CAAC,GAAG,EACZ,aAAa,CAAC,QAAQ,CAAC,MAAM,CAAC,CACjC,CAAC;4BACF;4BACI,+CAA+C;4BAC/C,QAAQ,CAAC,MAAM,KAAK,QAAQ,CAAC,MAAM;gCACnC,gEAAgE;gCAChE,iEAAiE;gCACjE,qFAAqF;gCACrF,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,EAAE;oCACnB,OAAO,CACH,aAAa,CAAC,IAAI,CAAC;wCACnB,QAAQ,CAAC,IAAI,CACT,CAAC,IAA+B,EAAE,EAAE,CAChC,IAAI,CAAC,GAAG,IAAI,IAAI,CAAC,IAAI;4CACrB,IAAI,CAAC,GAAG,GAAG,IAAI,CAAC,IAAI,CAAC,QAAQ,IAAI,IAAI,CAAC,EAAE,CAC/C,CACJ,CAAC;gCACN,CAAC,CAAC,EACJ,CAAC;gCACC,OAAO,cAAc,CAAC,EAAE,CAAC,GAAG,CAAC,CAAC;4BAClC,CAAC;wBACL,CAAC;oBACL,CAAC;oBACD,OAAO,KAAK,CAAC,GAAG,CAAC,EAAE,CAAC,OAAO,EAAE,EAAE,CAAC,GAAG,CAAC,CAAC;gBACzC,CAAC;aACJ;YACD,IAAI,EAAE,CAAC,IAAI,EAAE,EAAE,CAAC,gCAAgC,CAAC,IAAI,EAAE,WAAW,EAAE,OAAO,CAAC;YAC5E,KAAK,EAAE;gBACH,WAAW,EAAE,CAAC,KAAK,EAAE,EAAE;oBACnB,OAAO,GAAG,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC;gBAC/B,CAAC;gBACD,SAAS,EAAE;oBACP,CAAC,iBAAiB,CAAC,EAAE,CAAC,IAAI,EAAE,EAAE;wBAC1B,IAAI,QAAQ,GAAG,IAAI,CAAC,KAAK,CAAC,iBAAiB,CAAC,IAAI,CAAC,CAAC;wBAElD,MAAM,GAAG,GAAG,QAAQ,CAAC,aAAa,CAAC,KAAK,CAAC,CAAC;wBAE1C,MAAM,UAAU,GAAG,QAAQ,CAAC,aAAa,CAAC,MAAM,CAAC,CAAC;wBAClD,UAAU,CAAC,SAAS,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;wBAEjC,IAAI,QAAQ,EAAE,CAAC;4BACX,GAAG,CAAC,YAAY,CAAC,iBAAiB,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAC;4BACnD,UAAU,CAAC,SAAS,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;wBACvC,CAAC;wBAED,GAAG,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC;wBAEvB,OAAO;4BACH,GAAG;4BACH,UAAU;4BACV,MAAM,CAAC,OAAO;gCACV,IAAI,IAAI,CAAC,IAAI,KAAK,OAAO,CAAC,IAAI;oCAAE,OAAO,KAAK,CAAC;gCAE7C,MAAM,OAAO,GAAG,OAAO,CAAC,KAAK,CAAC,iBAAiB,CAAC,IAAI,CAAC,CAAC;gCACtD,IAAI,QAAQ,KAAK,OAAO,EAAE,CAAC;oCACvB,UAAU,CAAC,SAAS,GAAG,MAAM,CAAC;oCAC9B,IAAI,OAAO,EAAE,CAAC;wCACV,GAAG,CAAC,YAAY,CAAC,iBAAiB,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;wCAClD,UAAU,CAAC,SAAS,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;oCACtC,CAAC;yCAAM,CAAC;wCACJ,GAAG,CAAC,eAAe,CAAC,iBAAiB,CAAC,IAAI,CAAC,CAAC;oCAChD,CAAC;oCACD,QAAQ,GAAG,OAAO,CAAC;gCACvB,CAAC;gCAED,OAAO,IAAI,CAAC;4BAChB,CAAC;yBACJ,CAAC;oBACN,CAAC;iBACJ;aACJ;SACJ,CAAC,CAAC;IACP,CAAC,CAAC,CAAC;IAEH,SAAS,cAAc,CAAC,GAAS;QAC7B,MAAM,KAAK,GAAiB,EAAE,CAAC;QAE/B,KAAK,MAAM,EAAC,IAAI,EAAE,GAAG,EAAC,IAAI,kBAAkB,CAAC,GAAG,EAAE,aAAa,CAAC,GAAG,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,IAAI,CAAC,EAAE,CAAC;YACtF,IAAI,IAAI,GAAG,GAAG,GAAG,CAAC,CAAC;YACnB,IAAI,KAAuB,CAAC;YAE5B,MAAM,IAAI,GAAuB,IAAI,CAAC,KAAK,CAAC,iBAAiB,CAAC,IAAI,CAAC,CAAC;YACpE,IAAI,IAAI,IAAI,QAAQ,CAAC,UAAU,CAAC,IAAI,CAAC,EAAE,CAAC;gBACpC,KAAK,GAAG,QAAQ,CAAC,SAAS,CAAC,IAAI,EAAE,IAAI,CAAC,WAAW,CAAC,CAAC,QAAQ,CAAC;YAChE,CAAC;iBAAM,CAAC;gBACJ,SAAS;YACb,CAAC;YAED,KAAK,MAAM,EAAC,IAAI,EAAE,OAAO,EAAC,IAAI,UAAU,CAAC,KAAK,CAAC,EAAE,CAAC;gBAC9C,MAAM,EAAE,GAAG,IAAI,GAAG,IAAI,CAAC,MAAM,CAAC;gBAC9B,IAAI,OAAO,CAAC,MAAM,EAAE,CAAC;oBACjB,KAAK,CAAC,IAAI,CACN,UAAU,CAAC,MAAM,CAAC,IAAI,EAAE,EAAE,EAAE;wBACxB,KAAK,EAAE,OAAO,CAAC,IAAI,CAAC,GAAG,CAAC;qBAC3B,CAAC,CACL,CAAC;gBACN,CAAC;gBACD,IAAI,GAAG,EAAE,CAAC;YACd,CAAC;QACL,CAAC;QAED,OAAO,aAAa,CAAC,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC;IAC5C,CAAC;AACL,CAAC,CAAC;AAEF,SAAS,UAAU,CACf,KAAuB,EACvB,YAA+B,EAAE;IAEjC,OAAO,KAAK;SACP,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE;QACV,IAAI,OAAO,GAAG,SAAS,CAAC;QACxB,IAAI,IAAI,CAAC,IAAI,KAAK,SAAS,EAAE,CAAC;YAC1B,OAAO,GAAG,OAAO,CAAC,MAAM,CAAE,IAAI,CAAC,UAAU,CAAC,SAAsB,IAAI,EAAE,CAAC,CAAC;YACxE,OAAO,UAAU,CAAC,IAAI,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;QAC9C,CAAC;QAED,OAAO;YACH,IAAI,EAAE,IAAI,CAAC,IAAI,KAAK,SAAS,IAAI,IAAI,CAAC,IAAI,KAAK,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE;YACvE,OAAO;SACV,CAAC;IACN,CAAC,CAAC;SACD,IAAI,EAAE,CAAC;AAChB,CAAC;AAED,SAAS,aAAa,CAAC,IAAU;IAC7B,mBAAmB;IACnB,OAAO,OAAO,IAAI,CAAC,IAAI,KAAK,QAAQ,IAAI,OAAO,IAAI,CAAC,EAAE,KAAK,QAAQ,CAAC;AACxE,CAAC","sourcesContent":["import type {Options} from '@diplodoc/transform';\n// importing only type, because lowlight and highlight.js is optional deps\nimport type HLJS from 'highlight.js/lib/core';\nimport type {createLowlight} from 'lowlight' with {'resolution-mode': 'import'};\nimport type {Node} from 'prosemirror-model';\nimport {Plugin, PluginKey} from 'prosemirror-state';\nimport type {Step} from 'prosemirror-transform';\n// @ts-ignore // TODO: fix cjs build\nimport {findChildrenByType} from 'prosemirror-utils';\nimport {Decoration, DecorationSet} from 'prosemirror-view';\n\nimport type {ExtensionAuto} from '../../../../core';\nimport {capitalize} from '../../../../lodash';\nimport {logger} from '../../../../logger';\nimport {CodeBlockNodeAttr, codeBlockNodeName, codeBlockType} from '../CodeBlockSpecs';\n\nimport {codeLangSelectTooltipViewCreator} from './TooltipPlugin';\n\nexport type HighlightLangMap = Options['highlightLangs'];\n\ntype Lowlight = ReturnType<typeof createLowlight>;\ntype Root = ReturnType<Lowlight['highlight']>;\n\ntype LangSelectItem = {\n value: string;\n content: string;\n};\n\nconst key = new PluginKey<DecorationSet>('code_block_highlight');\n\nexport type CodeBlockHighlightOptions = {\n langs?: HighlightLangMap;\n};\n\nexport const CodeBlockHighlight: ExtensionAuto<CodeBlockHighlightOptions> = (builder, opts) => {\n let langs: NonNullable<HighlightLangMap>;\n let lowlight: Lowlight;\n let hljs: typeof HLJS;\n\n try {\n hljs = require('highlight.js/lib/core');\n const low = require('lowlight');\n const all: HighlightLangMap = low.all;\n const create: typeof createLowlight = low.createLowlight;\n langs = {...all, ...opts.langs};\n lowlight = create(langs);\n } catch (e) {\n logger.info('Skip code_block highlighting');\n return;\n }\n\n builder.addPlugin(() => {\n const selectItems: LangSelectItem[] = [];\n const mapping: Record<string, string> = {};\n for (const lang of Object.keys(langs)) {\n const defs = langs[lang](hljs);\n selectItems.push({\n value: lang,\n content: defs.name || capitalize(lang),\n });\n if (defs.aliases) {\n for (const alias of defs.aliases) {\n mapping[alias] = lang;\n }\n }\n }\n\n // TODO: add TAB key handler\n // TODO: Remove constant selection of block\n return new Plugin<DecorationSet>({\n key,\n state: {\n init: (_, state) => getDecorations(state.doc),\n apply: (tr, decos, oldState, newState) => {\n if (tr.docChanged) {\n const oldNodeName = oldState.selection.$head.parent.type.name;\n const newNodeName = newState.selection.$head.parent.type.name;\n\n // Apply decorations if:\n if (\n oldNodeName === codeBlockNodeName ||\n newNodeName === codeBlockNodeName\n ) {\n // selection includes codeblock node,\n return getDecorations(tr.doc);\n } else {\n const oldNodes = findChildrenByType(\n oldState.doc,\n codeBlockType(oldState.schema),\n );\n const newNodes = findChildrenByType(\n newState.doc,\n codeBlockType(newState.schema),\n );\n if (\n // OR transaction adds/removes codeblock nodes,\n newNodes.length !== oldNodes.length ||\n // OR transaction has changes that completely encapsulate a node\n // (for example, a transaction that affects the entire document).\n // Such transactions can happen during collab syncing via y-prosemirror, for example.\n tr.steps.some((step) => {\n return (\n stepHasFromTo(step) &&\n oldNodes.some(\n (node: {node: Node; pos: number}) =>\n node.pos >= step.from &&\n node.pos + node.node.nodeSize <= step.to,\n )\n );\n })\n ) {\n return getDecorations(tr.doc);\n }\n }\n }\n return decos.map(tr.mapping, tr.doc);\n },\n },\n view: (view) => codeLangSelectTooltipViewCreator(view, selectItems, mapping),\n props: {\n decorations: (state) => {\n return key.getState(state);\n },\n nodeViews: {\n [codeBlockNodeName]: (node) => {\n let prevLang = node.attrs[CodeBlockNodeAttr.Lang];\n\n const dom = document.createElement('pre');\n\n const contentDOM = document.createElement('code');\n contentDOM.classList.add('hljs');\n\n if (prevLang) {\n dom.setAttribute(CodeBlockNodeAttr.Lang, prevLang);\n contentDOM.classList.add(prevLang);\n }\n\n dom.append(contentDOM);\n\n return {\n dom,\n contentDOM,\n update(newNode) {\n if (node.type !== newNode.type) return false;\n\n const newLang = newNode.attrs[CodeBlockNodeAttr.Lang];\n if (prevLang !== newLang) {\n contentDOM.className = 'hljs';\n if (newLang) {\n dom.setAttribute(CodeBlockNodeAttr.Lang, newLang);\n contentDOM.classList.add(newLang);\n } else {\n dom.removeAttribute(CodeBlockNodeAttr.Lang);\n }\n prevLang = newLang;\n }\n\n return true;\n },\n };\n },\n },\n },\n });\n });\n\n function getDecorations(doc: Node) {\n const decos: Decoration[] = [];\n\n for (const {node, pos} of findChildrenByType(doc, codeBlockType(doc.type.schema), true)) {\n let from = pos + 1;\n let nodes: Root['children'];\n\n const lang: string | undefined = node.attrs[CodeBlockNodeAttr.Lang];\n if (lang && lowlight.registered(lang)) {\n nodes = lowlight.highlight(lang, node.textContent).children;\n } else {\n continue;\n }\n\n for (const {text, classes} of parseNodes(nodes)) {\n const to = from + text.length;\n if (classes.length) {\n decos.push(\n Decoration.inline(from, to, {\n class: classes.join(' '),\n }),\n );\n }\n from = to;\n }\n }\n\n return DecorationSet.create(doc, decos);\n }\n};\n\nfunction parseNodes(\n nodes: Root['children'],\n className: readonly string[] = [],\n): {text: string; classes: readonly string[]}[] {\n return nodes\n .map((node) => {\n let classes = className;\n if (node.type === 'element') {\n classes = classes.concat((node.properties.className as string[]) ?? []);\n return parseNodes(node.children, classes);\n }\n\n return {\n text: node.type === 'comment' || node.type === 'text' ? node.value : '',\n classes,\n };\n })\n .flat();\n}\n\nfunction stepHasFromTo(step: Step): step is Step & {from: number; to: number} {\n // @ts-expect-error\n return typeof step.from === 'number' && typeof step.to === 'number';\n}\n"]}
1
+ {"version":3,"file":"CodeBlockHighlight.js","sourceRoot":"../../../../../../src","sources":["extensions/markdown/CodeBlock/CodeBlockHighlight/CodeBlockHighlight.ts"],"names":[],"mappings":"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","sourcesContent":["import type {Options} from '@diplodoc/transform';\n// importing only type, because lowlight and highlight.js is optional deps\nimport type HLJS from 'highlight.js/lib/core';\nimport type {createLowlight} from 'lowlight' with {'resolution-mode': 'import'};\nimport type {Node} from 'prosemirror-model';\nimport {Plugin, PluginKey} from 'prosemirror-state';\nimport type {Step} from 'prosemirror-transform';\n// @ts-ignore // TODO: fix cjs build\nimport {findChildrenByType} from 'prosemirror-utils';\nimport {Decoration, DecorationSet} from 'prosemirror-view';\n\nimport type {ExtensionAuto} from '../../../../core';\nimport {capitalize} from '../../../../lodash';\nimport {globalLogger} from '../../../../logger';\nimport {CodeBlockNodeAttr, codeBlockNodeName, codeBlockType} from '../CodeBlockSpecs';\n\nimport {codeLangSelectTooltipViewCreator} from './TooltipPlugin';\n\nexport type HighlightLangMap = Options['highlightLangs'];\n\ntype Lowlight = ReturnType<typeof createLowlight>;\ntype Root = ReturnType<Lowlight['highlight']>;\n\ntype LangSelectItem = {\n value: string;\n content: string;\n};\n\nconst key = new PluginKey<DecorationSet>('code_block_highlight');\n\nexport type CodeBlockHighlightOptions = {\n langs?: HighlightLangMap;\n};\n\nexport const CodeBlockHighlight: ExtensionAuto<CodeBlockHighlightOptions> = (builder, opts) => {\n let langs: NonNullable<HighlightLangMap>;\n let lowlight: Lowlight;\n let hljs: typeof HLJS;\n\n try {\n hljs = require('highlight.js/lib/core');\n const low = require('lowlight');\n const all: HighlightLangMap = low.all;\n const create: typeof createLowlight = low.createLowlight;\n langs = {...all, ...opts.langs};\n lowlight = create(langs);\n } catch (e) {\n globalLogger.info('Skip code_block highlighting');\n builder.logger.log('Skip code_block highlighting');\n return;\n }\n\n builder.addPlugin(() => {\n const selectItems: LangSelectItem[] = [];\n const mapping: Record<string, string> = {};\n for (const lang of Object.keys(langs)) {\n const defs = langs[lang](hljs);\n selectItems.push({\n value: lang,\n content: defs.name || capitalize(lang),\n });\n if (defs.aliases) {\n for (const alias of defs.aliases) {\n mapping[alias] = lang;\n }\n }\n }\n\n // TODO: add TAB key handler\n // TODO: Remove constant selection of block\n return new Plugin<DecorationSet>({\n key,\n state: {\n init: (_, state) => getDecorations(state.doc),\n apply: (tr, decos, oldState, newState) => {\n if (tr.docChanged) {\n const oldNodeName = oldState.selection.$head.parent.type.name;\n const newNodeName = newState.selection.$head.parent.type.name;\n\n // Apply decorations if:\n if (\n oldNodeName === codeBlockNodeName ||\n newNodeName === codeBlockNodeName\n ) {\n // selection includes codeblock node,\n return getDecorations(tr.doc);\n } else {\n const oldNodes = findChildrenByType(\n oldState.doc,\n codeBlockType(oldState.schema),\n );\n const newNodes = findChildrenByType(\n newState.doc,\n codeBlockType(newState.schema),\n );\n if (\n // OR transaction adds/removes codeblock nodes,\n newNodes.length !== oldNodes.length ||\n // OR transaction has changes that completely encapsulate a node\n // (for example, a transaction that affects the entire document).\n // Such transactions can happen during collab syncing via y-prosemirror, for example.\n tr.steps.some((step) => {\n return (\n stepHasFromTo(step) &&\n oldNodes.some(\n (node: {node: Node; pos: number}) =>\n node.pos >= step.from &&\n node.pos + node.node.nodeSize <= step.to,\n )\n );\n })\n ) {\n return getDecorations(tr.doc);\n }\n }\n }\n return decos.map(tr.mapping, tr.doc);\n },\n },\n view: (view) => codeLangSelectTooltipViewCreator(view, selectItems, mapping),\n props: {\n decorations: (state) => {\n return key.getState(state);\n },\n nodeViews: {\n [codeBlockNodeName]: (node) => {\n let prevLang = node.attrs[CodeBlockNodeAttr.Lang];\n\n const dom = document.createElement('pre');\n\n const contentDOM = document.createElement('code');\n contentDOM.classList.add('hljs');\n\n if (prevLang) {\n dom.setAttribute(CodeBlockNodeAttr.Lang, prevLang);\n contentDOM.classList.add(prevLang);\n }\n\n dom.append(contentDOM);\n\n return {\n dom,\n contentDOM,\n update(newNode) {\n if (node.type !== newNode.type) return false;\n\n const newLang = newNode.attrs[CodeBlockNodeAttr.Lang];\n if (prevLang !== newLang) {\n contentDOM.className = 'hljs';\n if (newLang) {\n dom.setAttribute(CodeBlockNodeAttr.Lang, newLang);\n contentDOM.classList.add(newLang);\n } else {\n dom.removeAttribute(CodeBlockNodeAttr.Lang);\n }\n prevLang = newLang;\n }\n\n return true;\n },\n };\n },\n },\n },\n });\n });\n\n function getDecorations(doc: Node) {\n const decos: Decoration[] = [];\n\n for (const {node, pos} of findChildrenByType(doc, codeBlockType(doc.type.schema), true)) {\n let from = pos + 1;\n let nodes: Root['children'];\n\n const lang: string | undefined = node.attrs[CodeBlockNodeAttr.Lang];\n if (lang && lowlight.registered(lang)) {\n nodes = lowlight.highlight(lang, node.textContent).children;\n } else {\n continue;\n }\n\n for (const {text, classes} of parseNodes(nodes)) {\n const to = from + text.length;\n if (classes.length) {\n decos.push(\n Decoration.inline(from, to, {\n class: classes.join(' '),\n }),\n );\n }\n from = to;\n }\n }\n\n return DecorationSet.create(doc, decos);\n }\n};\n\nfunction parseNodes(\n nodes: Root['children'],\n className: readonly string[] = [],\n): {text: string; classes: readonly string[]}[] {\n return nodes\n .map((node) => {\n let classes = className;\n if (node.type === 'element') {\n classes = classes.concat((node.properties.className as string[]) ?? []);\n return parseNodes(node.children, classes);\n }\n\n return {\n text: node.type === 'comment' || node.type === 'text' ? node.value : '',\n classes,\n };\n })\n .flat();\n}\n\nfunction stepHasFromTo(step: Step): step is Step & {from: number; to: number} {\n // @ts-expect-error\n return typeof step.from === 'number' && typeof step.to === 'number';\n}\n"]}
@@ -1,4 +1,4 @@
1
- import { logger } from "../../../logger.js";
1
+ import { globalLogger } from "../../../logger.js";
2
2
  import { HtmlNode } from "./const.js";
3
3
  import { parserTokens } from "./parser.js";
4
4
  import { schemaSpecs } from "./schema.js";
@@ -6,7 +6,8 @@ import { serializerTokens } from "./serializer.js";
6
6
  export { HtmlAttr, HtmlNode } from "./const.js";
7
7
  export const Html = (builder) => {
8
8
  if (builder.context.has('html') && builder.context.get('html') === false) {
9
- logger.info('[HTML extension]: Skip extension, because HTML disabled via context');
9
+ globalLogger.info('[HTML extension]: Skip extension, because HTML disabled via context');
10
+ builder.logger.log('[HTML extension]: Skip extension, because HTML disabled via context');
10
11
  return;
11
12
  }
12
13
  builder.addNode(HtmlNode.Block, () => ({
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"../../../../../src","sources":["extensions/markdown/Html/index.ts"],"names":[],"mappings":"AACA,OAAO,EAAC,MAAM,EAAC,2BAAwB;AAEvC,OAAO,EAAC,QAAQ,EAAC,mBAAgB;AACjC,OAAO,EAAC,YAAY,EAAC,oBAAiB;AACtC,OAAO,EAAC,WAAW,EAAC,oBAAiB;AACrC,OAAO,EAAC,gBAAgB,EAAC,wBAAqB;AAE9C,OAAO,EAAC,QAAQ,EAAE,QAAQ,EAAC,mBAAgB;AAE3C,MAAM,CAAC,MAAM,IAAI,GAAkB,CAAC,OAAO,EAAE,EAAE;IAC3C,IAAI,OAAO,CAAC,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,IAAI,OAAO,CAAC,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,KAAK,KAAK,EAAE,CAAC;QACvE,MAAM,CAAC,IAAI,CAAC,qEAAqE,CAAC,CAAC;QACnF,OAAO;IACX,CAAC;IAED,OAAO,CAAC,OAAO,CAAC,QAAQ,CAAC,KAAK,EAAE,GAAG,EAAE,CAAC,CAAC;QACnC,IAAI,EAAE,WAAW,CAAC,QAAQ,CAAC,KAAK,CAAC;QACjC,MAAM,EAAE,EAAC,SAAS,EAAE,YAAY,CAAC,QAAQ,CAAC,KAAK,CAAC,EAAC;QACjD,IAAI,EAAE,gBAAgB,CAAC,QAAQ,CAAC,KAAK,CAAC;KACzC,CAAC,CAAC,CAAC;IAEJ,OAAO,CAAC,OAAO,CAAC,QAAQ,CAAC,MAAM,EAAE,GAAG,EAAE,CAAC,CAAC;QACpC,IAAI,EAAE,WAAW,CAAC,QAAQ,CAAC,MAAM,CAAC;QAClC,MAAM,EAAE,EAAC,SAAS,EAAE,YAAY,CAAC,QAAQ,CAAC,MAAM,CAAC,EAAC;QAClD,IAAI,EAAE,gBAAgB,CAAC,QAAQ,CAAC,MAAM,CAAC;KAC1C,CAAC,CAAC,CAAC;AACR,CAAC,CAAC","sourcesContent":["import type {ExtensionAuto} from '../../../core';\nimport {logger} from '../../../logger';\n\nimport {HtmlNode} from './const';\nimport {parserTokens} from './parser';\nimport {schemaSpecs} from './schema';\nimport {serializerTokens} from './serializer';\n\nexport {HtmlAttr, HtmlNode} from './const';\n\nexport const Html: ExtensionAuto = (builder) => {\n if (builder.context.has('html') && builder.context.get('html') === false) {\n logger.info('[HTML extension]: Skip extension, because HTML disabled via context');\n return;\n }\n\n builder.addNode(HtmlNode.Block, () => ({\n spec: schemaSpecs[HtmlNode.Block],\n fromMd: {tokenSpec: parserTokens[HtmlNode.Block]},\n toMd: serializerTokens[HtmlNode.Block],\n }));\n\n builder.addNode(HtmlNode.Inline, () => ({\n spec: schemaSpecs[HtmlNode.Inline],\n fromMd: {tokenSpec: parserTokens[HtmlNode.Inline]},\n toMd: serializerTokens[HtmlNode.Inline],\n }));\n};\n\ndeclare global {\n namespace WysiwygEditor {\n interface Context {\n /**\n * Same as @type {MarkdownIt.Options.html}\n */\n html: boolean;\n }\n }\n}\n"]}
1
+ {"version":3,"file":"index.js","sourceRoot":"../../../../../src","sources":["extensions/markdown/Html/index.ts"],"names":[],"mappings":"AACA,OAAO,EAAC,YAAY,EAAC,2BAAwB;AAE7C,OAAO,EAAC,QAAQ,EAAC,mBAAgB;AACjC,OAAO,EAAC,YAAY,EAAC,oBAAiB;AACtC,OAAO,EAAC,WAAW,EAAC,oBAAiB;AACrC,OAAO,EAAC,gBAAgB,EAAC,wBAAqB;AAE9C,OAAO,EAAC,QAAQ,EAAE,QAAQ,EAAC,mBAAgB;AAE3C,MAAM,CAAC,MAAM,IAAI,GAAkB,CAAC,OAAO,EAAE,EAAE;IAC3C,IAAI,OAAO,CAAC,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,IAAI,OAAO,CAAC,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,KAAK,KAAK,EAAE,CAAC;QACvE,YAAY,CAAC,IAAI,CAAC,qEAAqE,CAAC,CAAC;QACzF,OAAO,CAAC,MAAM,CAAC,GAAG,CAAC,qEAAqE,CAAC,CAAC;QAC1F,OAAO;IACX,CAAC;IAED,OAAO,CAAC,OAAO,CAAC,QAAQ,CAAC,KAAK,EAAE,GAAG,EAAE,CAAC,CAAC;QACnC,IAAI,EAAE,WAAW,CAAC,QAAQ,CAAC,KAAK,CAAC;QACjC,MAAM,EAAE,EAAC,SAAS,EAAE,YAAY,CAAC,QAAQ,CAAC,KAAK,CAAC,EAAC;QACjD,IAAI,EAAE,gBAAgB,CAAC,QAAQ,CAAC,KAAK,CAAC;KACzC,CAAC,CAAC,CAAC;IAEJ,OAAO,CAAC,OAAO,CAAC,QAAQ,CAAC,MAAM,EAAE,GAAG,EAAE,CAAC,CAAC;QACpC,IAAI,EAAE,WAAW,CAAC,QAAQ,CAAC,MAAM,CAAC;QAClC,MAAM,EAAE,EAAC,SAAS,EAAE,YAAY,CAAC,QAAQ,CAAC,MAAM,CAAC,EAAC;QAClD,IAAI,EAAE,gBAAgB,CAAC,QAAQ,CAAC,MAAM,CAAC;KAC1C,CAAC,CAAC,CAAC;AACR,CAAC,CAAC","sourcesContent":["import type {ExtensionAuto} from '../../../core';\nimport {globalLogger} from '../../../logger';\n\nimport {HtmlNode} from './const';\nimport {parserTokens} from './parser';\nimport {schemaSpecs} from './schema';\nimport {serializerTokens} from './serializer';\n\nexport {HtmlAttr, HtmlNode} from './const';\n\nexport const Html: ExtensionAuto = (builder) => {\n if (builder.context.has('html') && builder.context.get('html') === false) {\n globalLogger.info('[HTML extension]: Skip extension, because HTML disabled via context');\n builder.logger.log('[HTML extension]: Skip extension, because HTML disabled via context');\n return;\n }\n\n builder.addNode(HtmlNode.Block, () => ({\n spec: schemaSpecs[HtmlNode.Block],\n fromMd: {tokenSpec: parserTokens[HtmlNode.Block]},\n toMd: serializerTokens[HtmlNode.Block],\n }));\n\n builder.addNode(HtmlNode.Inline, () => ({\n spec: schemaSpecs[HtmlNode.Inline],\n fromMd: {tokenSpec: parserTokens[HtmlNode.Inline]},\n toMd: serializerTokens[HtmlNode.Inline],\n }));\n};\n\ndeclare global {\n namespace WysiwygEditor {\n interface Context {\n /**\n * Same as @type {MarkdownIt.Options.html}\n */\n html: boolean;\n }\n }\n}\n"]}
@@ -1,3 +1,3 @@
1
1
  import { Plugin } from 'prosemirror-state';
2
- import type { ExtensionDeps } from "../../../core/index.js";
2
+ import { type ExtensionDeps } from "../../../core/index.js";
3
3
  export declare function linkPasteEnhance({ markupParser: parser }: ExtensionDeps): Plugin<any>;
@@ -1,4 +1,5 @@
1
1
  import { Plugin, TextSelection } from 'prosemirror-state';
2
+ import { getLoggerFromState } from "../../../core/index.js";
2
3
  import { isNodeSelection, isTextSelection } from "../../../utils/selection.js";
3
4
  import { DataTransferType, isIosSafariShare } from "../../behavior/Clipboard/utils.js";
4
5
  import { imageType } from "../Image/index.js";
@@ -8,6 +9,10 @@ export function linkPasteEnhance({ markupParser: parser }) {
8
9
  props: {
9
10
  handleDOMEvents: {
10
11
  paste(view, e) {
12
+ const logger = getLoggerFromState(view.state).nested({
13
+ plugin: 'link-paste-enhance',
14
+ domEvent: 'paste',
15
+ });
11
16
  const { state, dispatch } = view;
12
17
  const sel = state.selection;
13
18
  let tr = null;
@@ -24,6 +29,9 @@ export function linkPasteEnhance({ markupParser: parser }) {
24
29
  .filter((mark) => mark.type !== linkMarkType),
25
30
  linkMarkType.create({ [LinkAttr.Href]: url }),
26
31
  ]), false);
32
+ logger.event({
33
+ event: 'paste-url',
34
+ });
27
35
  }
28
36
  }
29
37
  else if ($from.sameParent($to)) {
@@ -33,6 +41,9 @@ export function linkPasteEnhance({ markupParser: parser }) {
33
41
  [LinkAttr.Href]: url,
34
42
  }));
35
43
  tr.setSelection(TextSelection.create(tr.doc, $to.pos));
44
+ logger.event({
45
+ event: 'paste-url-on-text',
46
+ });
36
47
  }
37
48
  }
38
49
  }
@@ -1 +1 @@
1
- {"version":3,"file":"paste-plugin.js","sourceRoot":"../../../../../src","sources":["extensions/markdown/Link/paste-plugin.ts"],"names":[],"mappings":"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","sourcesContent":["import {Plugin, TextSelection, type Transaction} from 'prosemirror-state';\n\nimport type {ExtensionDeps, Parser} from '../../../core';\nimport {isNodeSelection, isTextSelection} from '../../../utils/selection';\nimport {DataTransferType, isIosSafariShare} from '../../behavior/Clipboard/utils';\nimport {imageType} from '../Image';\n\nimport {LinkAttr, linkType} from './index';\n\nexport function linkPasteEnhance({markupParser: parser}: ExtensionDeps) {\n return new Plugin({\n props: {\n handleDOMEvents: {\n paste(view, e): boolean {\n const {state, dispatch} = view;\n const sel = state.selection;\n let tr: Transaction | null = null;\n\n if (\n isTextSelection(sel) ||\n (isNodeSelection(sel) && sel.node.type === imageType(state.schema))\n ) {\n const {$from, $to} = sel;\n if ($from.pos === $to.pos) {\n const url = getUrl(e.clipboardData, parser);\n if (url) {\n const linkMarkType = linkType(state.schema);\n tr = state.tr.replaceSelectionWith(\n state.schema.text(url, [\n ...$from\n .marks()\n .filter((mark) => mark.type !== linkMarkType),\n linkMarkType.create({[LinkAttr.Href]: url}),\n ]),\n false,\n );\n }\n } else if ($from.sameParent($to)) {\n const url = getUrl(e.clipboardData, parser);\n if (url) {\n tr = state.tr.addMark(\n $from.pos,\n $to.pos,\n linkType(state.schema).create({\n [LinkAttr.Href]: url,\n }),\n );\n tr.setSelection(TextSelection.create(tr.doc, $to.pos));\n }\n }\n }\n\n if (tr) {\n dispatch(tr.scrollIntoView());\n e.preventDefault();\n return true;\n }\n\n return false;\n },\n },\n },\n });\n}\n\nfunction getUrl(data: DataTransfer | null, parser: Parser): string | null {\n if (!data || data.types.includes(DataTransferType.Yfm)) return null;\n if (isIosSafariShare(data)) return data.getData(DataTransferType.UriList);\n // TODO: should we process HTML here?\n const text = data.getData(DataTransferType.Text);\n const match = parser.matchLinks(text);\n if (match?.[0]?.raw === text) return match[0].url;\n return null;\n}\n"]}
1
+ {"version":3,"file":"paste-plugin.js","sourceRoot":"../../../../../src","sources":["extensions/markdown/Link/paste-plugin.ts"],"names":[],"mappings":"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","sourcesContent":["import {Plugin, TextSelection, type Transaction} from 'prosemirror-state';\n\nimport {type ExtensionDeps, type Parser, getLoggerFromState} from '../../../core';\nimport {isNodeSelection, isTextSelection} from '../../../utils/selection';\nimport {DataTransferType, isIosSafariShare} from '../../behavior/Clipboard/utils';\nimport {imageType} from '../Image';\n\nimport {LinkAttr, linkType} from './index';\n\nexport function linkPasteEnhance({markupParser: parser}: ExtensionDeps) {\n return new Plugin({\n props: {\n handleDOMEvents: {\n paste(view, e): boolean {\n const logger = getLoggerFromState(view.state).nested({\n plugin: 'link-paste-enhance',\n domEvent: 'paste',\n });\n\n const {state, dispatch} = view;\n const sel = state.selection;\n let tr: Transaction | null = null;\n\n if (\n isTextSelection(sel) ||\n (isNodeSelection(sel) && sel.node.type === imageType(state.schema))\n ) {\n const {$from, $to} = sel;\n if ($from.pos === $to.pos) {\n const url = getUrl(e.clipboardData, parser);\n if (url) {\n const linkMarkType = linkType(state.schema);\n tr = state.tr.replaceSelectionWith(\n state.schema.text(url, [\n ...$from\n .marks()\n .filter((mark) => mark.type !== linkMarkType),\n linkMarkType.create({[LinkAttr.Href]: url}),\n ]),\n false,\n );\n logger.event({\n event: 'paste-url',\n });\n }\n } else if ($from.sameParent($to)) {\n const url = getUrl(e.clipboardData, parser);\n if (url) {\n tr = state.tr.addMark(\n $from.pos,\n $to.pos,\n linkType(state.schema).create({\n [LinkAttr.Href]: url,\n }),\n );\n tr.setSelection(TextSelection.create(tr.doc, $to.pos));\n logger.event({\n event: 'paste-url-on-text',\n });\n }\n }\n }\n\n if (tr) {\n dispatch(tr.scrollIntoView());\n e.preventDefault();\n return true;\n }\n\n return false;\n },\n },\n },\n });\n}\n\nfunction getUrl(data: DataTransfer | null, parser: Parser): string | null {\n if (!data || data.types.includes(DataTransferType.Yfm)) return null;\n if (isIosSafariShare(data)) return data.getData(DataTransferType.UriList);\n // TODO: should we process HTML here?\n const text = data.getData(DataTransferType.Text);\n const match = parser.matchLinks(text);\n if (match?.[0]?.raw === text) return match[0].url;\n return null;\n}\n"]}
@@ -1,5 +1,5 @@
1
1
  import type { ParseInsertedUrlAsImage } from "../../../../bundle/index.js";
2
- import type { ExtensionAuto } from "../../../../core/index.js";
2
+ import { type ExtensionAuto } from "../../../../core/index.js";
3
3
  import type { FileUploadHandler } from "../../../../utils/index.js";
4
4
  import { type CreateImageNodeOptions } from "../utils.js";
5
5
  export type ImagePasteOptions = Pick<CreateImageNodeOptions, 'needDimensions' | 'enableNewImageSizeCalculation'> & {
@@ -2,6 +2,7 @@ import { decode as base64ToBuffer } from 'base64-arraybuffer';
2
2
  import { Fragment, Slice } from 'prosemirror-model';
3
3
  import { Plugin } from 'prosemirror-state';
4
4
  import { dropPoint } from 'prosemirror-transform';
5
+ import { getLoggerFromState } from "../../../../core/index.js";
5
6
  import { isFunction } from "../../../../lodash.js";
6
7
  import { clipboardUtils } from "../../../behavior/Clipboard/index.js";
7
8
  import { DataTransferType } from "../../../behavior/Clipboard/utils.js";
@@ -17,9 +18,14 @@ export const ImagePaste = (builder, opts) => {
17
18
  props: {
18
19
  handleDOMEvents: {
19
20
  paste(view, e) {
21
+ const logger = getLoggerFromState(view.state).nested({
22
+ plugin: 'image-paste',
23
+ domEvent: 'paste',
24
+ });
20
25
  const files = getPastedImages(e.clipboardData);
21
26
  if (imageUploadHandler && files) {
22
27
  e.preventDefault();
28
+ logger.event({ event: 'paste-images' });
23
29
  new ImagesUploadProcess(view, files, imageUploadHandler, view.state.tr.selection.from, opts).run();
24
30
  return true;
25
31
  }
@@ -35,6 +41,7 @@ export const ImagePaste = (builder, opts) => {
35
41
  });
36
42
  const tr = view.state.tr.replaceSelectionWith(imageNode);
37
43
  view.dispatch(tr.scrollIntoView());
44
+ logger.event({ event: 'paste-url-as-image' });
38
45
  return true;
39
46
  }
40
47
  return false;
@@ -53,6 +60,13 @@ export const ImagePaste = (builder, opts) => {
53
60
  if (dropPos === -1)
54
61
  return false;
55
62
  const posToInsert = dropPoint(view.state.doc, dropPos, createFakeImageSlice(view.state.schema));
63
+ const logger = getLoggerFromState(view.state);
64
+ logger.event({
65
+ event: 'drop-image',
66
+ plugin: 'image-paste',
67
+ domEvent: 'drop',
68
+ runProcess: posToInsert !== null,
69
+ });
56
70
  if (posToInsert !== null) {
57
71
  new ImagesUploadProcess(view, files, imageUploadHandler, posToInsert, opts).run();
58
72
  }
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"../../../../../../src","sources":["extensions/yfm/ImgSize/ImagePaste/index.ts"],"names":[],"mappings":"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","sourcesContent":["import {decode as base64ToBuffer} from 'base64-arraybuffer';\nimport {Fragment, type Node, type Schema, Slice} from 'prosemirror-model';\nimport {Plugin} from 'prosemirror-state';\nimport {dropPoint} from 'prosemirror-transform';\n\nimport type {ParseInsertedUrlAsImage} from '../../../../bundle';\nimport type {ExtensionAuto} from '../../../../core';\nimport {isFunction} from '../../../../lodash';\nimport type {FileUploadHandler} from '../../../../utils';\nimport {clipboardUtils} from '../../../behavior/Clipboard';\nimport {DataTransferType} from '../../../behavior/Clipboard/utils';\nimport {ImageAttr, ImgSizeAttr, imageType} from '../../../specs';\nimport {type CreateImageNodeOptions, isImageNode} from '../utils';\n\nimport {ImagesUploadProcess} from './upload';\n\nconst {isFilesFromHtml, isFilesOnly, isImageFile} = clipboardUtils;\n\nexport type ImagePasteOptions = Pick<\n CreateImageNodeOptions,\n 'needDimensions' | 'enableNewImageSizeCalculation'\n> & {\n imageUploadHandler?: FileUploadHandler;\n /**\n * The function, used to determine if the pasted text is the image url and should be inserted as an image\n */\n parseInsertedUrlAsImage?: ParseInsertedUrlAsImage;\n};\n\nexport const ImagePaste: ExtensionAuto<ImagePasteOptions> = (builder, opts) => {\n const {parseInsertedUrlAsImage, imageUploadHandler} = opts ?? {};\n\n if (!isFunction(imageUploadHandler ?? parseInsertedUrlAsImage))\n throw new Error(\n `ImagePaste extension: ${\n opts.imageUploadHandler ? 'imageUploadHandler' : 'parseInsertedUrlAsImage'\n } is not a function`,\n );\n\n builder.addPlugin(\n () =>\n new Plugin({\n props: {\n handleDOMEvents: {\n paste(view, e) {\n const files = getPastedImages(e.clipboardData);\n if (imageUploadHandler && files) {\n e.preventDefault();\n new ImagesUploadProcess(\n view,\n files,\n imageUploadHandler,\n view.state.tr.selection.from,\n opts,\n ).run();\n return true;\n } else if (parseInsertedUrlAsImage) {\n const {imageUrl, title} =\n parseInsertedUrlAsImage(\n e.clipboardData?.getData(DataTransferType.Text) ?? '',\n ) || {};\n\n if (!imageUrl) {\n return false;\n }\n\n e.preventDefault();\n\n const imageNode = imageType(view.state.schema).create({\n src: imageUrl,\n alt: title,\n });\n\n const tr = view.state.tr.replaceSelectionWith(imageNode);\n view.dispatch(tr.scrollIntoView());\n\n return true;\n }\n\n return false;\n },\n drop(view, e) {\n if (!imageUploadHandler) {\n return false;\n }\n\n // handle drop images from device\n if (view.dragging) return false;\n\n const files = getPastedImages(e.dataTransfer);\n if (!files) return false;\n\n const dropPos =\n view.posAtCoords({left: e.clientX, top: e.clientY})?.pos ?? -1;\n if (dropPos === -1) return false;\n\n const posToInsert = dropPoint(\n view.state.doc,\n dropPos,\n createFakeImageSlice(view.state.schema),\n );\n\n if (posToInsert !== null) {\n new ImagesUploadProcess(\n view,\n files,\n imageUploadHandler,\n posToInsert,\n opts,\n ).run();\n }\n\n e.preventDefault();\n return true;\n },\n },\n handlePaste(view, _event, slice) {\n if (!imageUploadHandler) {\n return false;\n }\n\n const node = sliceSingleNode(slice);\n if (node && isImageNode(node)) {\n const imgUrl = node.attrs[ImgSizeAttr.Src];\n const imgFile = dataUrlToFile(imgUrl, 'image');\n if (imgFile) {\n new ImagesUploadProcess(\n view,\n [imgFile],\n imageUploadHandler,\n view.state.tr.selection.from,\n opts,\n ).run();\n return true;\n }\n }\n return false;\n },\n },\n }),\n builder.Priority.VeryHigh,\n );\n};\n\nfunction getPastedImages(data: DataTransfer | null): File[] | null {\n if (!data || data.files.length === 0) return null;\n if (!isFilesOnly(data) && !isFilesFromHtml(data)) return null;\n const files = Array.from(data.files);\n return files.every(isImageFile) ? files : null;\n}\n\nfunction createFakeImageSlice(schema: Schema): Slice {\n return new Slice(\n Fragment.from(\n imageType(schema).create({\n [ImageAttr.Src]: 'fake',\n [ImageAttr.Title]: 'image',\n }),\n ),\n 0,\n 0,\n );\n}\n\n// copied from prosemirror-view input.ts\nfunction sliceSingleNode(slice: Slice): Node | null {\n return slice.openStart === 0 && slice.openEnd === 0 && slice.content.childCount === 1\n ? slice.content.firstChild\n : null;\n}\n\nfunction dataUrlToFile(dataUrl: string, filename: string): File | null {\n const [data, base64String] = dataUrl.split(',');\n if (!data || !base64String) return null;\n const mime = data.match(/^data:(.+);base64/)?.[1];\n if (!mime) return null;\n return new File([base64ToBuffer(base64String)], filename, {type: mime});\n}\n"]}
1
+ {"version":3,"file":"index.js","sourceRoot":"../../../../../../src","sources":["extensions/yfm/ImgSize/ImagePaste/index.ts"],"names":[],"mappings":"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","sourcesContent":["import {decode as base64ToBuffer} from 'base64-arraybuffer';\nimport {Fragment, type Node, type Schema, Slice} from 'prosemirror-model';\nimport {Plugin} from 'prosemirror-state';\nimport {dropPoint} from 'prosemirror-transform';\n\nimport type {ParseInsertedUrlAsImage} from '../../../../bundle';\nimport {type ExtensionAuto, getLoggerFromState} from '../../../../core';\nimport {isFunction} from '../../../../lodash';\nimport type {FileUploadHandler} from '../../../../utils';\nimport {clipboardUtils} from '../../../behavior/Clipboard';\nimport {DataTransferType} from '../../../behavior/Clipboard/utils';\nimport {ImageAttr, ImgSizeAttr, imageType} from '../../../specs';\nimport {type CreateImageNodeOptions, isImageNode} from '../utils';\n\nimport {ImagesUploadProcess} from './upload';\n\nconst {isFilesFromHtml, isFilesOnly, isImageFile} = clipboardUtils;\n\nexport type ImagePasteOptions = Pick<\n CreateImageNodeOptions,\n 'needDimensions' | 'enableNewImageSizeCalculation'\n> & {\n imageUploadHandler?: FileUploadHandler;\n /**\n * The function, used to determine if the pasted text is the image url and should be inserted as an image\n */\n parseInsertedUrlAsImage?: ParseInsertedUrlAsImage;\n};\n\nexport const ImagePaste: ExtensionAuto<ImagePasteOptions> = (builder, opts) => {\n const {parseInsertedUrlAsImage, imageUploadHandler} = opts ?? {};\n\n if (!isFunction(imageUploadHandler ?? parseInsertedUrlAsImage))\n throw new Error(\n `ImagePaste extension: ${\n opts.imageUploadHandler ? 'imageUploadHandler' : 'parseInsertedUrlAsImage'\n } is not a function`,\n );\n\n builder.addPlugin(\n () =>\n new Plugin({\n props: {\n handleDOMEvents: {\n paste(view, e) {\n const logger = getLoggerFromState(view.state).nested({\n plugin: 'image-paste',\n domEvent: 'paste',\n });\n\n const files = getPastedImages(e.clipboardData);\n if (imageUploadHandler && files) {\n e.preventDefault();\n logger.event({event: 'paste-images'});\n new ImagesUploadProcess(\n view,\n files,\n imageUploadHandler,\n view.state.tr.selection.from,\n opts,\n ).run();\n return true;\n } else if (parseInsertedUrlAsImage) {\n const {imageUrl, title} =\n parseInsertedUrlAsImage(\n e.clipboardData?.getData(DataTransferType.Text) ?? '',\n ) || {};\n\n if (!imageUrl) {\n return false;\n }\n\n e.preventDefault();\n\n const imageNode = imageType(view.state.schema).create({\n src: imageUrl,\n alt: title,\n });\n\n const tr = view.state.tr.replaceSelectionWith(imageNode);\n view.dispatch(tr.scrollIntoView());\n logger.event({event: 'paste-url-as-image'});\n\n return true;\n }\n\n return false;\n },\n drop(view, e) {\n if (!imageUploadHandler) {\n return false;\n }\n\n // handle drop images from device\n if (view.dragging) return false;\n\n const files = getPastedImages(e.dataTransfer);\n if (!files) return false;\n\n const dropPos =\n view.posAtCoords({left: e.clientX, top: e.clientY})?.pos ?? -1;\n if (dropPos === -1) return false;\n\n const posToInsert = dropPoint(\n view.state.doc,\n dropPos,\n createFakeImageSlice(view.state.schema),\n );\n\n const logger = getLoggerFromState(view.state);\n logger.event({\n event: 'drop-image',\n plugin: 'image-paste',\n domEvent: 'drop',\n runProcess: posToInsert !== null,\n });\n\n if (posToInsert !== null) {\n new ImagesUploadProcess(\n view,\n files,\n imageUploadHandler,\n posToInsert,\n opts,\n ).run();\n }\n\n e.preventDefault();\n return true;\n },\n },\n handlePaste(view, _event, slice) {\n if (!imageUploadHandler) {\n return false;\n }\n\n const node = sliceSingleNode(slice);\n if (node && isImageNode(node)) {\n const imgUrl = node.attrs[ImgSizeAttr.Src];\n const imgFile = dataUrlToFile(imgUrl, 'image');\n if (imgFile) {\n new ImagesUploadProcess(\n view,\n [imgFile],\n imageUploadHandler,\n view.state.tr.selection.from,\n opts,\n ).run();\n return true;\n }\n }\n return false;\n },\n },\n }),\n builder.Priority.VeryHigh,\n );\n};\n\nfunction getPastedImages(data: DataTransfer | null): File[] | null {\n if (!data || data.files.length === 0) return null;\n if (!isFilesOnly(data) && !isFilesFromHtml(data)) return null;\n const files = Array.from(data.files);\n return files.every(isImageFile) ? files : null;\n}\n\nfunction createFakeImageSlice(schema: Schema): Slice {\n return new Slice(\n Fragment.from(\n imageType(schema).create({\n [ImageAttr.Src]: 'fake',\n [ImageAttr.Title]: 'image',\n }),\n ),\n 0,\n 0,\n );\n}\n\n// copied from prosemirror-view input.ts\nfunction sliceSingleNode(slice: Slice): Node | null {\n return slice.openStart === 0 && slice.openEnd === 0 && slice.content.childCount === 1\n ? slice.content.firstChild\n : null;\n}\n\nfunction dataUrlToFile(dataUrl: string, filename: string): File | null {\n const [data, base64String] = dataUrl.split(',');\n if (!data || !base64String) return null;\n const mime = data.match(/^data:(.+);base64/)?.[1];\n if (!mime) return null;\n return new File([base64ToBuffer(base64String)], filename, {type: mime});\n}\n"]}
@@ -1,4 +1,4 @@
1
- import { logger } from "../../../../logger.js";
1
+ import { globalLogger } from "../../../../logger.js";
2
2
  import { getProportionalSize, } from "../../../../utils/index.js";
3
3
  import { FilesBatchUploadProcess } from "../../../behavior/utils/upload.js";
4
4
  import { imageType } from "../../../markdown/index.js";
@@ -12,28 +12,29 @@ export class ImagesUploadProcess extends FilesBatchUploadProcess {
12
12
  constructor(view, files, uploadHandler, position, opts) {
13
13
  super(view, files, uploadHandler);
14
14
  this.initPosition = position;
15
- this.createImage = createImageNode(imageType(this.view.state.schema), opts);
15
+ this.createImage = createImageNode(imageType(this.view.state.schema), opts, this.logger);
16
16
  this.enableNewImageSizeCalculation = opts.enableNewImageSizeCalculation;
17
17
  }
18
18
  async createSkeleton() {
19
19
  return new ImageSkeletonDescriptor(this.initPosition, await getSkeletonSize(this.files, {
20
20
  enableNewImageSizeCalculation: this.enableNewImageSizeCalculation,
21
- }));
21
+ }, this.logger));
22
22
  }
23
23
  async createPMNode(res) {
24
24
  return this.createImage(res);
25
25
  }
26
26
  }
27
- async function getSkeletonSize(files, opts) {
27
+ async function getSkeletonSize(files, opts, logger) {
28
28
  const skeletonSize = { width: '300', height: '200' };
29
29
  if (files.length === 1) {
30
30
  try {
31
- const size = await loadImage(files[0]).then(opts?.enableNewImageSizeCalculation ? calcSkeletonSizeNew : calcSkeletonSize);
31
+ const size = await loadImage(files[0]).then(opts.enableNewImageSizeCalculation ? calcSkeletonSizeNew : calcSkeletonSize);
32
32
  skeletonSize.width = String(size.width);
33
33
  skeletonSize.height = String(size.height);
34
34
  }
35
35
  catch (err) {
36
- logger.error(err);
36
+ globalLogger.error(err);
37
+ logger.error({ error: err });
37
38
  }
38
39
  }
39
40
  return skeletonSize;
@@ -1 +1 @@
1
- {"version":3,"file":"upload.js","sourceRoot":"../../../../../../src","sources":["extensions/yfm/ImgSize/ImagePaste/upload.ts"],"names":[],"mappings":"AAGA,OAAO,EAAC,MAAM,EAAC,8BAA2B;AAC1C,OAAO,EAGH,mBAAmB,GACtB,mCAA0B;AAC3B,OAAO,EAAC,uBAAuB,EAAC,0CAAuC;AACvE,OAAO,EAAC,SAAS,EAAC,mCAA0B;AAC5C,OAAO,EAAC,cAAc,EAAC,oBAAiB;AACxC,OAAO,EAA8B,eAAe,EAAE,SAAS,EAAC,oBAAiB;AAEjF,OAAO,EAAC,uBAAuB,EAAC,sBAAmB;AAEnD,MAAM,OAAO,mBAAoB,SAAQ,uBAAuB;IACzC,WAAW,CAAC;IAEZ,YAAY,CAAS;IACvB,6BAA6B,CAAW;IAEzD,YACI,IAAgB,EAChB,KAAsB,EACtB,aAAgC,EAChC,QAAgB,EAChB,IAA4B;QAE5B,KAAK,CAAC,IAAI,EAAE,KAAK,EAAE,aAAa,CAAC,CAAC;QAElC,IAAI,CAAC,YAAY,GAAG,QAAQ,CAAC;QAC7B,IAAI,CAAC,WAAW,GAAG,eAAe,CAAC,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,EAAE,IAAI,CAAC,CAAC;QAC5E,IAAI,CAAC,6BAA6B,GAAG,IAAI,CAAC,6BAA6B,CAAC;IAC5E,CAAC;IAES,KAAK,CAAC,cAAc;QAC1B,OAAO,IAAI,uBAAuB,CAC9B,IAAI,CAAC,YAAY,EACjB,MAAM,eAAe,CAAC,IAAI,CAAC,KAAK,EAAE;YAC9B,6BAA6B,EAAE,IAAI,CAAC,6BAA6B;SACpE,CAAC,CACL,CAAC;IACN,CAAC;IAES,KAAK,CAAC,YAAY,CAAC,GAAsB;QAC/C,OAAO,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC;IACjC,CAAC;CACJ;AAED,KAAK,UAAU,eAAe,CAC1B,KAAsB,EACtB,IAAgD;IAEhD,MAAM,YAAY,GAAG,EAAC,KAAK,EAAE,KAAK,EAAE,MAAM,EAAE,KAAK,EAAC,CAAC;IACnD,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACrB,IAAI,CAAC;YACD,MAAM,IAAI,GAAG,MAAM,SAAS,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CACvC,IAAI,EAAE,6BAA6B,CAAC,CAAC,CAAC,mBAAmB,CAAC,CAAC,CAAC,gBAAgB,CAC/E,CAAC;YACF,YAAY,CAAC,KAAK,GAAG,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;YACxC,YAAY,CAAC,MAAM,GAAG,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;QAC9C,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACX,MAAM,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;QACtB,CAAC;IACL,CAAC;IACD,OAAO,YAAY,CAAC;AACxB,CAAC;AAED,SAAS,gBAAgB,CAAC,EAAC,KAAK,EAAE,MAAM,EAAmB;IACvD,IAAI,MAAM,IAAI,cAAc;QAAE,OAAO,EAAC,KAAK,EAAE,MAAM,EAAC,CAAC;IAErD,MAAM,KAAK,GAAG,cAAc,GAAG,MAAM,CAAC,CAAC,UAAU;IACjD,OAAO,EAAC,MAAM,EAAE,cAAc,EAAE,KAAK,EAAE,KAAK,GAAG,KAAK,EAAC,CAAC;AAC1D,CAAC;AAED,SAAS,mBAAmB,CAAC,EAAC,KAAK,EAAE,MAAM,EAAmB;IAC1D,OAAO,mBAAmB,CAAC;QACvB,KAAK;QACL,MAAM;QACN,YAAY,EAAE,cAAc;KAC/B,CAAC,CAAC;AACP,CAAC","sourcesContent":["import type {Node} from 'prosemirror-model';\nimport type {EditorView} from 'prosemirror-view';\n\nimport {logger} from '../../../../logger';\nimport {\n type FileUploadHandler,\n type UploadSuccessItem,\n getProportionalSize,\n} from '../../../../utils';\nimport {FilesBatchUploadProcess} from '../../../behavior/utils/upload';\nimport {imageType} from '../../../markdown';\nimport {IMG_MAX_HEIGHT} from '../const';\nimport {type CreateImageNodeOptions, createImageNode, loadImage} from '../utils';\n\nimport {ImageSkeletonDescriptor} from './skeleton';\n\nexport class ImagesUploadProcess extends FilesBatchUploadProcess {\n protected readonly createImage;\n\n protected readonly initPosition: number;\n private readonly enableNewImageSizeCalculation?: boolean;\n\n constructor(\n view: EditorView,\n files: readonly File[],\n uploadHandler: FileUploadHandler,\n position: number,\n opts: CreateImageNodeOptions,\n ) {\n super(view, files, uploadHandler);\n\n this.initPosition = position;\n this.createImage = createImageNode(imageType(this.view.state.schema), opts);\n this.enableNewImageSizeCalculation = opts.enableNewImageSizeCalculation;\n }\n\n protected async createSkeleton() {\n return new ImageSkeletonDescriptor(\n this.initPosition,\n await getSkeletonSize(this.files, {\n enableNewImageSizeCalculation: this.enableNewImageSizeCalculation,\n }),\n );\n }\n\n protected async createPMNode(res: UploadSuccessItem): Promise<Node> {\n return this.createImage(res);\n }\n}\n\nasync function getSkeletonSize(\n files: readonly File[],\n opts?: {enableNewImageSizeCalculation?: boolean},\n) {\n const skeletonSize = {width: '300', height: '200'};\n if (files.length === 1) {\n try {\n const size = await loadImage(files[0]).then(\n opts?.enableNewImageSizeCalculation ? calcSkeletonSizeNew : calcSkeletonSize,\n );\n skeletonSize.width = String(size.width);\n skeletonSize.height = String(size.height);\n } catch (err) {\n logger.error(err);\n }\n }\n return skeletonSize;\n}\n\nfunction calcSkeletonSize({width, height}: HTMLImageElement): {width: number; height: number} {\n if (height <= IMG_MAX_HEIGHT) return {width, height};\n\n const ratio = IMG_MAX_HEIGHT / height; // ratio<1\n return {height: IMG_MAX_HEIGHT, width: width * ratio};\n}\n\nfunction calcSkeletonSizeNew({width, height}: HTMLImageElement): {width: number; height: number} {\n return getProportionalSize({\n width,\n height,\n imgMaxHeight: IMG_MAX_HEIGHT,\n });\n}\n"]}
1
+ {"version":3,"file":"upload.js","sourceRoot":"../../../../../../src","sources":["extensions/yfm/ImgSize/ImagePaste/upload.ts"],"names":[],"mappings":"AAGA,OAAO,EAAe,YAAY,EAAC,8BAA2B;AAC9D,OAAO,EAGH,mBAAmB,GACtB,mCAA0B;AAC3B,OAAO,EAAC,uBAAuB,EAAC,0CAAuC;AACvE,OAAO,EAAC,SAAS,EAAC,mCAA0B;AAC5C,OAAO,EAAC,cAAc,EAAC,oBAAiB;AACxC,OAAO,EAA8B,eAAe,EAAE,SAAS,EAAC,oBAAiB;AAEjF,OAAO,EAAC,uBAAuB,EAAC,sBAAmB;AAEnD,MAAM,OAAO,mBAAoB,SAAQ,uBAAuB;IACzC,WAAW,CAAC;IAEZ,YAAY,CAAS;IACvB,6BAA6B,CAAW;IAEzD,YACI,IAAgB,EAChB,KAAsB,EACtB,aAAgC,EAChC,QAAgB,EAChB,IAA4B;QAE5B,KAAK,CAAC,IAAI,EAAE,KAAK,EAAE,aAAa,CAAC,CAAC;QAElC,IAAI,CAAC,YAAY,GAAG,QAAQ,CAAC;QAC7B,IAAI,CAAC,WAAW,GAAG,eAAe,CAAC,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,EAAE,IAAI,EAAE,IAAI,CAAC,MAAM,CAAC,CAAC;QACzF,IAAI,CAAC,6BAA6B,GAAG,IAAI,CAAC,6BAA6B,CAAC;IAC5E,CAAC;IAES,KAAK,CAAC,cAAc;QAC1B,OAAO,IAAI,uBAAuB,CAC9B,IAAI,CAAC,YAAY,EACjB,MAAM,eAAe,CACjB,IAAI,CAAC,KAAK,EACV;YACI,6BAA6B,EAAE,IAAI,CAAC,6BAA6B;SACpE,EACD,IAAI,CAAC,MAAM,CACd,CACJ,CAAC;IACN,CAAC;IAES,KAAK,CAAC,YAAY,CAAC,GAAsB;QAC/C,OAAO,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC;IACjC,CAAC;CACJ;AAED,KAAK,UAAU,eAAe,CAC1B,KAAsB,EACtB,IAA+C,EAC/C,MAAuB;IAEvB,MAAM,YAAY,GAAG,EAAC,KAAK,EAAE,KAAK,EAAE,MAAM,EAAE,KAAK,EAAC,CAAC;IACnD,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACrB,IAAI,CAAC;YACD,MAAM,IAAI,GAAG,MAAM,SAAS,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CACvC,IAAI,CAAC,6BAA6B,CAAC,CAAC,CAAC,mBAAmB,CAAC,CAAC,CAAC,gBAAgB,CAC9E,CAAC;YACF,YAAY,CAAC,KAAK,GAAG,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;YACxC,YAAY,CAAC,MAAM,GAAG,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;QAC9C,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACX,YAAY,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;YACxB,MAAM,CAAC,KAAK,CAAC,EAAC,KAAK,EAAE,GAAG,EAAC,CAAC,CAAC;QAC/B,CAAC;IACL,CAAC;IACD,OAAO,YAAY,CAAC;AACxB,CAAC;AAED,SAAS,gBAAgB,CAAC,EAAC,KAAK,EAAE,MAAM,EAAmB;IACvD,IAAI,MAAM,IAAI,cAAc;QAAE,OAAO,EAAC,KAAK,EAAE,MAAM,EAAC,CAAC;IAErD,MAAM,KAAK,GAAG,cAAc,GAAG,MAAM,CAAC,CAAC,UAAU;IACjD,OAAO,EAAC,MAAM,EAAE,cAAc,EAAE,KAAK,EAAE,KAAK,GAAG,KAAK,EAAC,CAAC;AAC1D,CAAC;AAED,SAAS,mBAAmB,CAAC,EAAC,KAAK,EAAE,MAAM,EAAmB;IAC1D,OAAO,mBAAmB,CAAC;QACvB,KAAK;QACL,MAAM;QACN,YAAY,EAAE,cAAc;KAC/B,CAAC,CAAC;AACP,CAAC","sourcesContent":["import type {Node} from 'prosemirror-model';\nimport type {EditorView} from 'prosemirror-view';\n\nimport {type Logger2, globalLogger} from '../../../../logger';\nimport {\n type FileUploadHandler,\n type UploadSuccessItem,\n getProportionalSize,\n} from '../../../../utils';\nimport {FilesBatchUploadProcess} from '../../../behavior/utils/upload';\nimport {imageType} from '../../../markdown';\nimport {IMG_MAX_HEIGHT} from '../const';\nimport {type CreateImageNodeOptions, createImageNode, loadImage} from '../utils';\n\nimport {ImageSkeletonDescriptor} from './skeleton';\n\nexport class ImagesUploadProcess extends FilesBatchUploadProcess {\n protected readonly createImage;\n\n protected readonly initPosition: number;\n private readonly enableNewImageSizeCalculation?: boolean;\n\n constructor(\n view: EditorView,\n files: readonly File[],\n uploadHandler: FileUploadHandler,\n position: number,\n opts: CreateImageNodeOptions,\n ) {\n super(view, files, uploadHandler);\n\n this.initPosition = position;\n this.createImage = createImageNode(imageType(this.view.state.schema), opts, this.logger);\n this.enableNewImageSizeCalculation = opts.enableNewImageSizeCalculation;\n }\n\n protected async createSkeleton() {\n return new ImageSkeletonDescriptor(\n this.initPosition,\n await getSkeletonSize(\n this.files,\n {\n enableNewImageSizeCalculation: this.enableNewImageSizeCalculation,\n },\n this.logger,\n ),\n );\n }\n\n protected async createPMNode(res: UploadSuccessItem): Promise<Node> {\n return this.createImage(res);\n }\n}\n\nasync function getSkeletonSize(\n files: readonly File[],\n opts: {enableNewImageSizeCalculation?: boolean},\n logger: Logger2.ILogger,\n) {\n const skeletonSize = {width: '300', height: '200'};\n if (files.length === 1) {\n try {\n const size = await loadImage(files[0]).then(\n opts.enableNewImageSizeCalculation ? calcSkeletonSizeNew : calcSkeletonSize,\n );\n skeletonSize.width = String(size.width);\n skeletonSize.height = String(size.height);\n } catch (err) {\n globalLogger.error(err);\n logger.error({error: err});\n }\n }\n return skeletonSize;\n}\n\nfunction calcSkeletonSize({width, height}: HTMLImageElement): {width: number; height: number} {\n if (height <= IMG_MAX_HEIGHT) return {width, height};\n\n const ratio = IMG_MAX_HEIGHT / height; // ratio<1\n return {height: IMG_MAX_HEIGHT, width: width * ratio};\n}\n\nfunction calcSkeletonSizeNew({width, height}: HTMLImageElement): {width: number; height: number} {\n return getProportionalSize({\n width,\n height,\n imgMaxHeight: IMG_MAX_HEIGHT,\n });\n}\n"]}
@@ -1,4 +1,5 @@
1
1
  import type { Node, NodeType } from 'prosemirror-model';
2
+ import { type Logger2 } from "../../../logger.js";
2
3
  import { type UploadSuccessItem } from "../../../utils/index.js";
3
4
  import { ImgSizeAttr } from "../../specs.js";
4
5
  export declare function isImageNode(node: Node): boolean;
@@ -6,7 +7,7 @@ export type CreateImageNodeOptions = {
6
7
  needDimensions: boolean;
7
8
  enableNewImageSizeCalculation?: boolean;
8
9
  };
9
- export declare const createImageNode: (imgType: NodeType, opts: CreateImageNodeOptions) => ({ result, file }: UploadSuccessItem) => Promise<Node>;
10
+ export declare const createImageNode: (imgType: NodeType, opts: CreateImageNodeOptions, logger: Logger2.ILogger) => ({ result, file }: UploadSuccessItem) => Promise<Node>;
10
11
  export declare function loadImage(imgFile: File): Promise<HTMLImageElement>;
11
12
  export declare function getImageSize(img: HTMLImageElement): {
12
13
  [ImgSizeAttr.Height]?: string;
@@ -1,4 +1,4 @@
1
- import { logger } from "../../../logger.js";
1
+ import { globalLogger } from "../../../logger.js";
2
2
  import { getProportionalSize } from "../../../utils/index.js";
3
3
  import { imageNodeName } from "../../markdown/index.js";
4
4
  import { ImgSizeAttr } from "../../specs.js";
@@ -6,7 +6,7 @@ import { IMG_MAX_HEIGHT } from "./const.js";
6
6
  export function isImageNode(node) {
7
7
  return node.type.name === imageNodeName;
8
8
  }
9
- export const createImageNode = (imgType, opts) => async ({ result, file }) => {
9
+ export const createImageNode = (imgType, opts, logger) => async ({ result, file }) => {
10
10
  const attrs = {
11
11
  [ImgSizeAttr.Src]: result.url,
12
12
  [ImgSizeAttr.Alt]: result.name ?? file.name,
@@ -17,7 +17,8 @@ export const createImageNode = (imgType, opts) => async ({ result, file }) => {
17
17
  Object.assign(attrs, sizes);
18
18
  }
19
19
  catch (err) {
20
- logger.error(err);
20
+ globalLogger.error(err);
21
+ logger.error({ error: err });
21
22
  }
22
23
  }
23
24
  return imgType.create(attrs);