@gravity-ui/markdown-editor 15.0.2 → 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 (248) 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/ImageWidget/index.d.ts +3 -1
  84. package/build/cjs/extensions/yfm/ImgSize/ImageWidget/index.js +2 -0
  85. package/build/cjs/extensions/yfm/ImgSize/ImageWidget/index.js.map +1 -1
  86. package/build/cjs/extensions/yfm/ImgSize/ImageWidget/view.d.ts +15 -3
  87. package/build/cjs/extensions/yfm/ImgSize/ImageWidget/view.js +16 -8
  88. package/build/cjs/extensions/yfm/ImgSize/ImageWidget/view.js.map +1 -1
  89. package/build/cjs/extensions/yfm/ImgSize/ImageWidget/widget.d.ts +3 -0
  90. package/build/cjs/extensions/yfm/ImgSize/ImageWidget/widget.js +13 -2
  91. package/build/cjs/extensions/yfm/ImgSize/ImageWidget/widget.js.map +1 -1
  92. package/build/cjs/extensions/yfm/ImgSize/index.d.ts +2 -1
  93. package/build/cjs/extensions/yfm/ImgSize/index.js +2 -0
  94. package/build/cjs/extensions/yfm/ImgSize/index.js.map +1 -1
  95. package/build/cjs/extensions/yfm/ImgSize/utils.d.ts +2 -1
  96. package/build/cjs/extensions/yfm/ImgSize/utils.js +3 -2
  97. package/build/cjs/extensions/yfm/ImgSize/utils.js.map +1 -1
  98. package/build/cjs/extensions/yfm/YfmCut/index.css +1 -1
  99. package/build/cjs/extensions/yfm/YfmFile/YfmFilePaste/index.d.ts +1 -1
  100. package/build/cjs/extensions/yfm/YfmFile/YfmFilePaste/index.js +15 -1
  101. package/build/cjs/extensions/yfm/YfmFile/YfmFilePaste/index.js.map +1 -1
  102. package/build/cjs/i18n/yfm-note/index.d.ts +1 -1
  103. package/build/cjs/logger.d.ts +75 -0
  104. package/build/cjs/logger.js +89 -1
  105. package/build/cjs/logger.js.map +1 -1
  106. package/build/cjs/markup/codemirror/create.d.ts +2 -0
  107. package/build/cjs/markup/codemirror/create.js +15 -4
  108. package/build/cjs/markup/codemirror/create.js.map +1 -1
  109. package/build/cjs/markup/codemirror/files-upload-plugin/plugin.js +13 -0
  110. package/build/cjs/markup/codemirror/files-upload-plugin/plugin.js.map +1 -1
  111. package/build/cjs/markup/codemirror/logger-facet.d.ts +3 -0
  112. package/build/cjs/markup/codemirror/logger-facet.js +9 -0
  113. package/build/cjs/markup/codemirror/logger-facet.js.map +1 -0
  114. package/build/cjs/utils/event-emitter.d.ts +1 -0
  115. package/build/cjs/utils/event-emitter.js +3 -0
  116. package/build/cjs/utils/event-emitter.js.map +1 -1
  117. package/build/cjs/utils/facet.d.ts +1 -0
  118. package/build/cjs/utils/facet.js +33 -0
  119. package/build/cjs/utils/facet.js.map +1 -0
  120. package/build/cjs/utils/keymap.js +7 -2
  121. package/build/cjs/utils/keymap.js.map +1 -1
  122. package/build/cjs/version.js +1 -1
  123. package/build/cjs/version.js.map +1 -1
  124. package/build/esm/bundle/Editor.d.ts +3 -0
  125. package/build/esm/bundle/Editor.js +22 -3
  126. package/build/esm/bundle/Editor.js.map +1 -1
  127. package/build/esm/bundle/MarkdownEditorView.js +3 -2
  128. package/build/esm/bundle/MarkdownEditorView.js.map +1 -1
  129. package/build/esm/bundle/MarkupEditorView.js +7 -2
  130. package/build/esm/bundle/MarkupEditorView.js.map +1 -1
  131. package/build/esm/bundle/MarkupManager.d.ts +3 -6
  132. package/build/esm/bundle/MarkupManager.js +5 -5
  133. package/build/esm/bundle/MarkupManager.js.map +1 -1
  134. package/build/esm/bundle/WysiwygEditorView.js +7 -2
  135. package/build/esm/bundle/WysiwygEditorView.js.map +1 -1
  136. package/build/esm/bundle/types.d.ts +2 -0
  137. package/build/esm/bundle/types.js.map +1 -1
  138. package/build/esm/bundle/useMarkdownEditor.js +5 -3
  139. package/build/esm/bundle/useMarkdownEditor.js.map +1 -1
  140. package/build/esm/core/Editor.d.ts +3 -1
  141. package/build/esm/core/Editor.js +6 -3
  142. package/build/esm/core/Editor.js.map +1 -1
  143. package/build/esm/core/ExtensionBuilder.d.ts +3 -1
  144. package/build/esm/core/ExtensionBuilder.js +6 -1
  145. package/build/esm/core/ExtensionBuilder.js.map +1 -1
  146. package/build/esm/core/ExtensionsManager.d.ts +4 -2
  147. package/build/esm/core/ExtensionsManager.js +6 -5
  148. package/build/esm/core/ExtensionsManager.js.map +1 -1
  149. package/build/esm/core/ParserTokensRegistry.d.ts +6 -0
  150. package/build/esm/core/ParserTokensRegistry.js +9 -1
  151. package/build/esm/core/ParserTokensRegistry.js.map +1 -1
  152. package/build/esm/core/index.d.ts +1 -0
  153. package/build/esm/core/index.js +1 -0
  154. package/build/esm/core/index.js.map +1 -1
  155. package/build/esm/core/markdown/MarkdownParser.d.ts +9 -1
  156. package/build/esm/core/markdown/MarkdownParser.js +7 -3
  157. package/build/esm/core/markdown/MarkdownParser.js.map +1 -1
  158. package/build/esm/core/utils/logger.d.ts +3 -0
  159. package/build/esm/core/utils/logger.js +8 -0
  160. package/build/esm/core/utils/logger.js.map +1 -0
  161. package/build/esm/core/utils/metrics.d.ts +2 -1
  162. package/build/esm/core/utils/metrics.js +8 -2
  163. package/build/esm/core/utils/metrics.js.map +1 -1
  164. package/build/esm/extensions/behavior/Autocomplete/handler.d.ts +3 -1
  165. package/build/esm/extensions/behavior/Autocomplete/handler.js +15 -9
  166. package/build/esm/extensions/behavior/Autocomplete/handler.js.map +1 -1
  167. package/build/esm/extensions/behavior/Autocomplete/index.js +1 -1
  168. package/build/esm/extensions/behavior/Autocomplete/index.js.map +1 -1
  169. package/build/esm/extensions/behavior/Clipboard/clipboard.d.ts +3 -1
  170. package/build/esm/extensions/behavior/Clipboard/clipboard.js +32 -4
  171. package/build/esm/extensions/behavior/Clipboard/clipboard.js.map +1 -1
  172. package/build/esm/extensions/behavior/Clipboard/index.js +4 -0
  173. package/build/esm/extensions/behavior/Clipboard/index.js.map +1 -1
  174. package/build/esm/extensions/behavior/CommandMenu/handler.d.ts +3 -1
  175. package/build/esm/extensions/behavior/CommandMenu/handler.js +7 -4
  176. package/build/esm/extensions/behavior/CommandMenu/handler.js.map +1 -1
  177. package/build/esm/extensions/behavior/CommandMenu/index.js +6 -4
  178. package/build/esm/extensions/behavior/CommandMenu/index.js.map +1 -1
  179. package/build/esm/extensions/behavior/EditorModeKeymap/index.js +13 -2
  180. package/build/esm/extensions/behavior/EditorModeKeymap/index.js.map +1 -1
  181. package/build/esm/extensions/behavior/FilePaste/index.d.ts +1 -1
  182. package/build/esm/extensions/behavior/FilePaste/index.js +12 -0
  183. package/build/esm/extensions/behavior/FilePaste/index.js.map +1 -1
  184. package/build/esm/extensions/behavior/SelectionContext/index.js +3 -3
  185. package/build/esm/extensions/behavior/SelectionContext/index.js.map +1 -1
  186. package/build/esm/extensions/behavior/SelectionContext/tooltip.d.ts +3 -1
  187. package/build/esm/extensions/behavior/SelectionContext/tooltip.js +8 -3
  188. package/build/esm/extensions/behavior/SelectionContext/tooltip.js.map +1 -1
  189. package/build/esm/extensions/behavior/utils/upload.d.ts +2 -0
  190. package/build/esm/extensions/behavior/utils/upload.js +3 -0
  191. package/build/esm/extensions/behavior/utils/upload.js.map +1 -1
  192. package/build/esm/extensions/markdown/Breaks/index.js +3 -2
  193. package/build/esm/extensions/markdown/Breaks/index.js.map +1 -1
  194. package/build/esm/extensions/markdown/CodeBlock/CodeBlockHighlight/CodeBlockHighlight.js +3 -2
  195. package/build/esm/extensions/markdown/CodeBlock/CodeBlockHighlight/CodeBlockHighlight.js.map +1 -1
  196. package/build/esm/extensions/markdown/Html/index.js +3 -2
  197. package/build/esm/extensions/markdown/Html/index.js.map +1 -1
  198. package/build/esm/extensions/markdown/Link/paste-plugin.d.ts +1 -1
  199. package/build/esm/extensions/markdown/Link/paste-plugin.js +11 -0
  200. package/build/esm/extensions/markdown/Link/paste-plugin.js.map +1 -1
  201. package/build/esm/extensions/yfm/ImgSize/ImagePaste/index.d.ts +1 -1
  202. package/build/esm/extensions/yfm/ImgSize/ImagePaste/index.js +14 -0
  203. package/build/esm/extensions/yfm/ImgSize/ImagePaste/index.js.map +1 -1
  204. package/build/esm/extensions/yfm/ImgSize/ImagePaste/upload.js +7 -6
  205. package/build/esm/extensions/yfm/ImgSize/ImagePaste/upload.js.map +1 -1
  206. package/build/esm/extensions/yfm/ImgSize/ImageWidget/index.d.ts +3 -1
  207. package/build/esm/extensions/yfm/ImgSize/ImageWidget/index.js +2 -0
  208. package/build/esm/extensions/yfm/ImgSize/ImageWidget/index.js.map +1 -1
  209. package/build/esm/extensions/yfm/ImgSize/ImageWidget/view.d.ts +15 -3
  210. package/build/esm/extensions/yfm/ImgSize/ImageWidget/view.js +15 -7
  211. package/build/esm/extensions/yfm/ImgSize/ImageWidget/view.js.map +1 -1
  212. package/build/esm/extensions/yfm/ImgSize/ImageWidget/widget.d.ts +3 -0
  213. package/build/esm/extensions/yfm/ImgSize/ImageWidget/widget.js +14 -3
  214. package/build/esm/extensions/yfm/ImgSize/ImageWidget/widget.js.map +1 -1
  215. package/build/esm/extensions/yfm/ImgSize/index.d.ts +2 -1
  216. package/build/esm/extensions/yfm/ImgSize/index.js +2 -0
  217. package/build/esm/extensions/yfm/ImgSize/index.js.map +1 -1
  218. package/build/esm/extensions/yfm/ImgSize/utils.d.ts +2 -1
  219. package/build/esm/extensions/yfm/ImgSize/utils.js +4 -3
  220. package/build/esm/extensions/yfm/ImgSize/utils.js.map +1 -1
  221. package/build/esm/extensions/yfm/YfmCut/index.css +1 -1
  222. package/build/esm/extensions/yfm/YfmFile/YfmFilePaste/index.d.ts +1 -1
  223. package/build/esm/extensions/yfm/YfmFile/YfmFilePaste/index.js +15 -1
  224. package/build/esm/extensions/yfm/YfmFile/YfmFilePaste/index.js.map +1 -1
  225. package/build/esm/i18n/yfm-note/index.d.ts +1 -1
  226. package/build/esm/logger.d.ts +75 -0
  227. package/build/esm/logger.js +87 -0
  228. package/build/esm/logger.js.map +1 -1
  229. package/build/esm/markup/codemirror/create.d.ts +2 -0
  230. package/build/esm/markup/codemirror/create.js +16 -5
  231. package/build/esm/markup/codemirror/create.js.map +1 -1
  232. package/build/esm/markup/codemirror/files-upload-plugin/plugin.js +13 -0
  233. package/build/esm/markup/codemirror/files-upload-plugin/plugin.js.map +1 -1
  234. package/build/esm/markup/codemirror/logger-facet.d.ts +3 -0
  235. package/build/esm/markup/codemirror/logger-facet.js +6 -0
  236. package/build/esm/markup/codemirror/logger-facet.js.map +1 -0
  237. package/build/esm/utils/event-emitter.d.ts +1 -0
  238. package/build/esm/utils/event-emitter.js +3 -0
  239. package/build/esm/utils/event-emitter.js.map +1 -1
  240. package/build/esm/utils/facet.d.ts +1 -0
  241. package/build/esm/utils/facet.js +29 -0
  242. package/build/esm/utils/facet.js.map +1 -0
  243. package/build/esm/utils/keymap.js +7 -2
  244. package/build/esm/utils/keymap.js.map +1 -1
  245. package/build/esm/version.js +1 -1
  246. package/build/esm/version.js.map +1 -1
  247. package/build/styles.css +1 -1
  248. package/package.json +2 -2
@@ -1 +1 @@
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 {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":"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,YAAY,EAAC,8BAA2B;AAChD,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,YAAY,CAAC,IAAI,CAAC,8BAA8B,CAAC,CAAC;QAClD,OAAO,CAAC,MAAM,CAAC,GAAG,CAAC,8BAA8B,CAAC,CAAC;QACnD,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 {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,9 +1,11 @@
1
1
  import type { Action, ExtensionAuto } from "../../../../core/index.js";
2
2
  import type { FileUploadHandler } from "../../../../utils/upload.js";
3
+ import type { RenderImageWidgetFormFn } from "./view.js";
3
4
  import type { ImageWidgetDescriptorOpts } from "./widget.js";
4
5
  declare const addImageWidgetAction = "addImageWidget";
5
- export type ImageWidgetOptions = Pick<ImageWidgetDescriptorOpts, 'needToSetDimensionsForUploadedImages'> & {
6
+ export type ImageWidgetOptions = Pick<ImageWidgetDescriptorOpts, 'needToSetDimensionsForUploadedImages' | 'enableNewImageSizeCalculation'> & {
6
7
  imageUploadHandler?: FileUploadHandler;
8
+ renderImageWidgetForm?: RenderImageWidgetFormFn;
7
9
  };
8
10
  export declare const ImageWidget: ExtensionAuto<ImageWidgetOptions>;
9
11
  declare global {
@@ -3,7 +3,9 @@ const addImageWidgetAction = 'addImageWidget';
3
3
  export const ImageWidget = (builder, opts) => {
4
4
  builder.addAction(addImageWidgetAction, (deps) => addImageWidget(deps, {
5
5
  uploadImages: opts.imageUploadHandler,
6
+ renderImageForm: opts.renderImageWidgetForm,
6
7
  needToSetDimensionsForUploadedImages: opts.needToSetDimensionsForUploadedImages,
8
+ enableNewImageSizeCalculation: opts.enableNewImageSizeCalculation,
7
9
  }));
8
10
  };
9
11
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"../../../../../../src","sources":["extensions/yfm/ImgSize/ImageWidget/index.ts"],"names":[],"mappings":"AAGA,OAAO,EAAC,cAAc,EAAC,qBAAkB;AAGzC,MAAM,oBAAoB,GAAG,gBAAgB,CAAC;AAS9C,MAAM,CAAC,MAAM,WAAW,GAAsC,CAAC,OAAO,EAAE,IAAI,EAAE,EAAE;IAC5E,OAAO,CAAC,SAAS,CAAC,oBAAoB,EAAE,CAAC,IAAI,EAAE,EAAE,CAC7C,cAAc,CAAC,IAAI,EAAE;QACjB,YAAY,EAAE,IAAI,CAAC,kBAAkB;QACrC,oCAAoC,EAAE,IAAI,CAAC,oCAAoC;KAClF,CAAC,CACL,CAAC;AACN,CAAC,CAAC","sourcesContent":["import type {Action, ExtensionAuto} from '../../../../core';\nimport type {FileUploadHandler} from '../../../../utils/upload';\n\nimport {addImageWidget} from './actions';\nimport type {ImageWidgetDescriptorOpts} from './widget';\n\nconst addImageWidgetAction = 'addImageWidget';\n\nexport type ImageWidgetOptions = Pick<\n ImageWidgetDescriptorOpts,\n 'needToSetDimensionsForUploadedImages'\n> & {\n imageUploadHandler?: FileUploadHandler;\n};\n\nexport const ImageWidget: ExtensionAuto<ImageWidgetOptions> = (builder, opts) => {\n builder.addAction(addImageWidgetAction, (deps) =>\n addImageWidget(deps, {\n uploadImages: opts.imageUploadHandler,\n needToSetDimensionsForUploadedImages: opts.needToSetDimensionsForUploadedImages,\n }),\n );\n};\n\ndeclare global {\n namespace WysiwygEditor {\n interface Actions {\n [addImageWidgetAction]: Action;\n }\n }\n}\n"]}
1
+ {"version":3,"file":"index.js","sourceRoot":"../../../../../../src","sources":["extensions/yfm/ImgSize/ImageWidget/index.ts"],"names":[],"mappings":"AAGA,OAAO,EAAC,cAAc,EAAC,qBAAkB;AAIzC,MAAM,oBAAoB,GAAG,gBAAgB,CAAC;AAU9C,MAAM,CAAC,MAAM,WAAW,GAAsC,CAAC,OAAO,EAAE,IAAI,EAAE,EAAE;IAC5E,OAAO,CAAC,SAAS,CAAC,oBAAoB,EAAE,CAAC,IAAI,EAAE,EAAE,CAC7C,cAAc,CAAC,IAAI,EAAE;QACjB,YAAY,EAAE,IAAI,CAAC,kBAAkB;QACrC,eAAe,EAAE,IAAI,CAAC,qBAAqB;QAC3C,oCAAoC,EAAE,IAAI,CAAC,oCAAoC;QAC/E,6BAA6B,EAAE,IAAI,CAAC,6BAA6B;KACpE,CAAC,CACL,CAAC;AACN,CAAC,CAAC","sourcesContent":["import type {Action, ExtensionAuto} from '../../../../core';\nimport type {FileUploadHandler} from '../../../../utils/upload';\n\nimport {addImageWidget} from './actions';\nimport type {RenderImageWidgetFormFn} from './view';\nimport type {ImageWidgetDescriptorOpts} from './widget';\n\nconst addImageWidgetAction = 'addImageWidget';\n\nexport type ImageWidgetOptions = Pick<\n ImageWidgetDescriptorOpts,\n 'needToSetDimensionsForUploadedImages' | 'enableNewImageSizeCalculation'\n> & {\n imageUploadHandler?: FileUploadHandler;\n renderImageWidgetForm?: RenderImageWidgetFormFn;\n};\n\nexport const ImageWidget: ExtensionAuto<ImageWidgetOptions> = (builder, opts) => {\n builder.addAction(addImageWidgetAction, (deps) =>\n addImageWidget(deps, {\n uploadImages: opts.imageUploadHandler,\n renderImageForm: opts.renderImageWidgetForm,\n needToSetDimensionsForUploadedImages: opts.needToSetDimensionsForUploadedImages,\n enableNewImageSizeCalculation: opts.enableNewImageSizeCalculation,\n }),\n );\n};\n\ndeclare global {\n namespace WysiwygEditor {\n interface Actions {\n [addImageWidgetAction]: Action;\n }\n }\n}\n"]}
@@ -1,8 +1,20 @@
1
- import { type ImageFormProps } from "../../../../forms/ImageForm.js";
1
+ import { type ImageFormProps, type ImageFormSubmitParams } from "../../../../forms/ImageForm.js";
2
2
  import "./view.css";
3
- export type FilePlaceholderProps = {
3
+ export type RenderImageWidgetFormProps = {
4
+ /** Handler for submitting form */
5
+ onSubmit: (params: ImageFormSubmitParams) => void;
6
+ /** Handler for cancellation */
7
+ onCancel: () => void;
8
+ /** Handler for attach file from device */
9
+ onAttach?: (files: File[]) => void;
10
+ /** Uploading attached file */
11
+ uploading?: boolean;
12
+ };
13
+ export type RenderImageWidgetFormFn = (props: RenderImageWidgetFormProps) => React.ReactNode;
14
+ export type ImagePlaceholderProps = {
4
15
  onCancel: () => void;
5
16
  onSubmit: ImageFormProps['onSubmit'];
6
17
  onAttach?: (files: File[]) => Promise<void>;
18
+ renderForm?: RenderImageWidgetFormFn;
7
19
  };
8
- export declare const FilePlaceholder: React.FC<FilePlaceholderProps>;
20
+ export declare const ImagePlaceholder: React.FC<ImagePlaceholderProps>;
@@ -4,28 +4,36 @@ import { Picture as ImageIcon } from '@gravity-ui/icons';
4
4
  import { Icon, Popup } from '@gravity-ui/uikit';
5
5
  import { useMountedState } from 'react-use';
6
6
  import { cn } from "../../../../classname.js";
7
- import { ImageForm } from "../../../../forms/ImageForm.js";
7
+ import { ImageForm, } from "../../../../forms/ImageForm.js";
8
8
  import { i18n } from "../../../../i18n/widgets/index.js";
9
9
  import { useBooleanState, useElementState } from "../../../../react-utils/hooks.js";
10
10
  import "./view.css";
11
11
  const b = cn('image-placeholder');
12
12
  const placement = ['bottom-start', 'top-start', 'bottom-end', 'top-end'];
13
- export const FilePlaceholder = ({ onCancel, onSubmit, onAttach }) => {
13
+ const defaultFormRenderer = (props) => {
14
+ return (_jsx(ImageForm, { autoFocus: true, loading: props.uploading, onCancel: props.onCancel, onSubmit: props.onSubmit, onAttach: props.onAttach }));
15
+ };
16
+ export const ImagePlaceholder = ({ onCancel, onSubmit, onAttach, renderForm, }) => {
14
17
  const isMounted = useMountedState();
15
- const [loading, showLoading, hideLoading] = useBooleanState(false);
18
+ const [uploading, startUploading, stopUploading] = useBooleanState(false);
16
19
  const [anchor, setAnchor] = useElementState();
17
20
  const attachHandler = useCallback((files) => {
18
21
  if (!onAttach)
19
22
  return;
20
23
  if (isMounted()) {
21
- showLoading();
24
+ startUploading();
22
25
  onAttach(files).finally(() => {
23
26
  if (isMounted()) {
24
- hideLoading();
27
+ stopUploading();
25
28
  }
26
29
  });
27
30
  }
28
- }, [isMounted, onAttach, showLoading, hideLoading]);
29
- return (_jsxs(_Fragment, { children: [_jsxs("div", { ref: setAnchor, className: b(), children: [_jsx(Icon, { data: ImageIcon, size: 24 }), i18n('image')] }), _jsx(Popup, { open: true, modal: true, onOpenChange: onCancel, anchorElement: anchor, placement: placement, children: _jsx(ImageForm, { autoFocus: true, loading: loading, onCancel: onCancel, onSubmit: onSubmit, onAttach: onAttach && attachHandler }) })] }));
31
+ }, [isMounted, onAttach, startUploading, stopUploading]);
32
+ return (_jsxs(_Fragment, { children: [_jsxs("div", { ref: setAnchor, className: b(), children: [_jsx(Icon, { data: ImageIcon, size: 24 }), i18n('image')] }), _jsx(Popup, { open: true, modal: true, onOpenChange: onCancel, anchorElement: anchor, placement: placement, children: (renderForm || defaultFormRenderer)({
33
+ onCancel,
34
+ onSubmit,
35
+ uploading,
36
+ onAttach: onAttach && attachHandler,
37
+ }) })] }));
30
38
  };
31
39
  //# sourceMappingURL=view.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"view.js","sourceRoot":"../../../../../../src","sources":["extensions/yfm/ImgSize/ImageWidget/view.tsx"],"names":[],"mappings":";AAAA,OAAO,EAAC,WAAW,EAAC,MAAM,OAAO,CAAC;AAElC,OAAO,EAAC,OAAO,IAAI,SAAS,EAAC,MAAM,mBAAmB,CAAC;AACvD,OAAO,EAAC,IAAI,EAAE,KAAK,EAAsB,MAAM,mBAAmB,CAAC;AACnE,OAAO,EAAC,eAAe,EAAC,MAAM,WAAW,CAAC;AAE1C,OAAO,EAAC,EAAE,EAAC,iCAA8B;AACzC,OAAO,EAAC,SAAS,EAAsB,uCAAoC;AAC3E,OAAO,EAAC,IAAI,EAAC,0CAAiC;AAC9C,OAAO,EAAC,eAAe,EAAE,eAAe,EAAC,yCAAsC;AAE/E,oBAAqB;AAErB,MAAM,CAAC,GAAG,EAAE,CAAC,mBAAmB,CAAC,CAAC;AAClC,MAAM,SAAS,GAAmB,CAAC,cAAc,EAAE,WAAW,EAAE,YAAY,EAAE,SAAS,CAAC,CAAC;AAQzF,MAAM,CAAC,MAAM,eAAe,GAAmC,CAAC,EAAC,QAAQ,EAAE,QAAQ,EAAE,QAAQ,EAAC,EAAE,EAAE;IAC9F,MAAM,SAAS,GAAG,eAAe,EAAE,CAAC;IACpC,MAAM,CAAC,OAAO,EAAE,WAAW,EAAE,WAAW,CAAC,GAAG,eAAe,CAAC,KAAK,CAAC,CAAC;IACnE,MAAM,CAAC,MAAM,EAAE,SAAS,CAAC,GAAG,eAAe,EAAE,CAAC;IAC9C,MAAM,aAAa,GAAG,WAAW,CAC7B,CAAC,KAAK,EAAE,EAAE;QACN,IAAI,CAAC,QAAQ;YAAE,OAAO;QACtB,IAAI,SAAS,EAAE,EAAE,CAAC;YACd,WAAW,EAAE,CAAC;YACd,QAAQ,CAAC,KAAK,CAAC,CAAC,OAAO,CAAC,GAAG,EAAE;gBACzB,IAAI,SAAS,EAAE,EAAE,CAAC;oBACd,WAAW,EAAE,CAAC;gBAClB,CAAC;YACL,CAAC,CAAC,CAAC;QACP,CAAC;IACL,CAAC,EACD,CAAC,SAAS,EAAE,QAAQ,EAAE,WAAW,EAAE,WAAW,CAAC,CAClD,CAAC;IAEF,OAAO,CACH,8BACI,eAAK,GAAG,EAAE,SAAS,EAAE,SAAS,EAAE,CAAC,EAAE,aAC/B,KAAC,IAAI,IAAC,IAAI,EAAE,SAAS,EAAE,IAAI,EAAE,EAAE,GAAI,EAClC,IAAI,CAAC,OAAO,CAAC,IACZ,EACN,KAAC,KAAK,IAAC,IAAI,QAAC,KAAK,QAAC,YAAY,EAAE,QAAQ,EAAE,aAAa,EAAE,MAAM,EAAE,SAAS,EAAE,SAAS,YACjF,KAAC,SAAS,IACN,SAAS,QACT,OAAO,EAAE,OAAO,EAChB,QAAQ,EAAE,QAAQ,EAClB,QAAQ,EAAE,QAAQ,EAClB,QAAQ,EAAE,QAAQ,IAAI,aAAa,GACrC,GACE,IACT,CACN,CAAC;AACN,CAAC,CAAC","sourcesContent":["import {useCallback} from 'react';\n\nimport {Picture as ImageIcon} from '@gravity-ui/icons';\nimport {Icon, Popup, type PopupPlacement} from '@gravity-ui/uikit';\nimport {useMountedState} from 'react-use';\n\nimport {cn} from '../../../../classname';\nimport {ImageForm, type ImageFormProps} from '../../../../forms/ImageForm';\nimport {i18n} from '../../../../i18n/widgets';\nimport {useBooleanState, useElementState} from '../../../../react-utils/hooks';\n\nimport './view.scss';\n\nconst b = cn('image-placeholder');\nconst placement: PopupPlacement = ['bottom-start', 'top-start', 'bottom-end', 'top-end'];\n\nexport type FilePlaceholderProps = {\n onCancel: () => void;\n onSubmit: ImageFormProps['onSubmit'];\n onAttach?: (files: File[]) => Promise<void>;\n};\n\nexport const FilePlaceholder: React.FC<FilePlaceholderProps> = ({onCancel, onSubmit, onAttach}) => {\n const isMounted = useMountedState();\n const [loading, showLoading, hideLoading] = useBooleanState(false);\n const [anchor, setAnchor] = useElementState();\n const attachHandler = useCallback<NonNullable<ImageFormProps['onAttach']>>(\n (files) => {\n if (!onAttach) return;\n if (isMounted()) {\n showLoading();\n onAttach(files).finally(() => {\n if (isMounted()) {\n hideLoading();\n }\n });\n }\n },\n [isMounted, onAttach, showLoading, hideLoading],\n );\n\n return (\n <>\n <div ref={setAnchor} className={b()}>\n <Icon data={ImageIcon} size={24} />\n {i18n('image')}\n </div>\n <Popup open modal onOpenChange={onCancel} anchorElement={anchor} placement={placement}>\n <ImageForm\n autoFocus\n loading={loading}\n onCancel={onCancel}\n onSubmit={onSubmit}\n onAttach={onAttach && attachHandler}\n />\n </Popup>\n </>\n );\n};\n"]}
1
+ {"version":3,"file":"view.js","sourceRoot":"../../../../../../src","sources":["extensions/yfm/ImgSize/ImageWidget/view.tsx"],"names":[],"mappings":";AAAA,OAAO,EAAC,WAAW,EAAC,MAAM,OAAO,CAAC;AAElC,OAAO,EAAC,OAAO,IAAI,SAAS,EAAC,MAAM,mBAAmB,CAAC;AACvD,OAAO,EAAC,IAAI,EAAE,KAAK,EAAsB,MAAM,mBAAmB,CAAC;AACnE,OAAO,EAAC,eAAe,EAAC,MAAM,WAAW,CAAC;AAE1C,OAAO,EAAC,EAAE,EAAC,iCAA8B;AACzC,OAAO,EACH,SAAS,GAGZ,uCAAoC;AACrC,OAAO,EAAC,IAAI,EAAC,0CAAiC;AAC9C,OAAO,EAAC,eAAe,EAAE,eAAe,EAAC,yCAAsC;AAE/E,oBAAqB;AAErB,MAAM,CAAC,GAAG,EAAE,CAAC,mBAAmB,CAAC,CAAC;AAClC,MAAM,SAAS,GAAmB,CAAC,cAAc,EAAE,WAAW,EAAE,YAAY,EAAE,SAAS,CAAC,CAAC;AAczF,MAAM,mBAAmB,GAA4B,CAAC,KAAK,EAAE,EAAE;IAC3D,OAAO,CACH,KAAC,SAAS,IACN,SAAS,QACT,OAAO,EAAE,KAAK,CAAC,SAAS,EACxB,QAAQ,EAAE,KAAK,CAAC,QAAQ,EACxB,QAAQ,EAAE,KAAK,CAAC,QAAQ,EACxB,QAAQ,EAAE,KAAK,CAAC,QAAQ,GAC1B,CACL,CAAC;AACN,CAAC,CAAC;AASF,MAAM,CAAC,MAAM,gBAAgB,GAAoC,CAAC,EAC9D,QAAQ,EACR,QAAQ,EACR,QAAQ,EACR,UAAU,GACb,EAAE,EAAE;IACD,MAAM,SAAS,GAAG,eAAe,EAAE,CAAC;IACpC,MAAM,CAAC,SAAS,EAAE,cAAc,EAAE,aAAa,CAAC,GAAG,eAAe,CAAC,KAAK,CAAC,CAAC;IAC1E,MAAM,CAAC,MAAM,EAAE,SAAS,CAAC,GAAG,eAAe,EAAE,CAAC;IAC9C,MAAM,aAAa,GAAG,WAAW,CAC7B,CAAC,KAAK,EAAE,EAAE;QACN,IAAI,CAAC,QAAQ;YAAE,OAAO;QACtB,IAAI,SAAS,EAAE,EAAE,CAAC;YACd,cAAc,EAAE,CAAC;YACjB,QAAQ,CAAC,KAAK,CAAC,CAAC,OAAO,CAAC,GAAG,EAAE;gBACzB,IAAI,SAAS,EAAE,EAAE,CAAC;oBACd,aAAa,EAAE,CAAC;gBACpB,CAAC;YACL,CAAC,CAAC,CAAC;QACP,CAAC;IACL,CAAC,EACD,CAAC,SAAS,EAAE,QAAQ,EAAE,cAAc,EAAE,aAAa,CAAC,CACvD,CAAC;IAEF,OAAO,CACH,8BACI,eAAK,GAAG,EAAE,SAAS,EAAE,SAAS,EAAE,CAAC,EAAE,aAC/B,KAAC,IAAI,IAAC,IAAI,EAAE,SAAS,EAAE,IAAI,EAAE,EAAE,GAAI,EAClC,IAAI,CAAC,OAAO,CAAC,IACZ,EACN,KAAC,KAAK,IAAC,IAAI,QAAC,KAAK,QAAC,YAAY,EAAE,QAAQ,EAAE,aAAa,EAAE,MAAM,EAAE,SAAS,EAAE,SAAS,YAChF,CAAC,UAAU,IAAI,mBAAmB,CAAC,CAAC;oBACjC,QAAQ;oBACR,QAAQ;oBACR,SAAS;oBACT,QAAQ,EAAE,QAAQ,IAAI,aAAa;iBACtC,CAAC,GACE,IACT,CACN,CAAC;AACN,CAAC,CAAC","sourcesContent":["import {useCallback} from 'react';\n\nimport {Picture as ImageIcon} from '@gravity-ui/icons';\nimport {Icon, Popup, type PopupPlacement} from '@gravity-ui/uikit';\nimport {useMountedState} from 'react-use';\n\nimport {cn} from '../../../../classname';\nimport {\n ImageForm,\n type ImageFormProps,\n type ImageFormSubmitParams,\n} from '../../../../forms/ImageForm';\nimport {i18n} from '../../../../i18n/widgets';\nimport {useBooleanState, useElementState} from '../../../../react-utils/hooks';\n\nimport './view.scss';\n\nconst b = cn('image-placeholder');\nconst placement: PopupPlacement = ['bottom-start', 'top-start', 'bottom-end', 'top-end'];\n\nexport type RenderImageWidgetFormProps = {\n /** Handler for submitting form */\n onSubmit: (params: ImageFormSubmitParams) => void;\n /** Handler for cancellation */\n onCancel: () => void;\n /** Handler for attach file from device */\n onAttach?: (files: File[]) => void;\n /** Uploading attached file */\n uploading?: boolean;\n};\nexport type RenderImageWidgetFormFn = (props: RenderImageWidgetFormProps) => React.ReactNode;\n\nconst defaultFormRenderer: RenderImageWidgetFormFn = (props) => {\n return (\n <ImageForm\n autoFocus\n loading={props.uploading}\n onCancel={props.onCancel}\n onSubmit={props.onSubmit}\n onAttach={props.onAttach}\n />\n );\n};\n\nexport type ImagePlaceholderProps = {\n onCancel: () => void;\n onSubmit: ImageFormProps['onSubmit'];\n onAttach?: (files: File[]) => Promise<void>;\n renderForm?: RenderImageWidgetFormFn;\n};\n\nexport const ImagePlaceholder: React.FC<ImagePlaceholderProps> = ({\n onCancel,\n onSubmit,\n onAttach,\n renderForm,\n}) => {\n const isMounted = useMountedState();\n const [uploading, startUploading, stopUploading] = useBooleanState(false);\n const [anchor, setAnchor] = useElementState();\n const attachHandler = useCallback<NonNullable<ImageFormProps['onAttach']>>(\n (files) => {\n if (!onAttach) return;\n if (isMounted()) {\n startUploading();\n onAttach(files).finally(() => {\n if (isMounted()) {\n stopUploading();\n }\n });\n }\n },\n [isMounted, onAttach, startUploading, stopUploading],\n );\n\n return (\n <>\n <div ref={setAnchor} className={b()}>\n <Icon data={ImageIcon} size={24} />\n {i18n('image')}\n </div>\n <Popup open modal onOpenChange={onCancel} anchorElement={anchor} placement={placement}>\n {(renderForm || defaultFormRenderer)({\n onCancel,\n onSubmit,\n uploading,\n onAttach: onAttach && attachHandler,\n })}\n </Popup>\n </>\n );\n};\n"]}
@@ -1,9 +1,12 @@
1
1
  import type { Transaction } from 'prosemirror-state';
2
2
  import type { ExtensionDeps } from "../../../../core/index.js";
3
3
  import type { FileUploadHandler } from "../../../../utils/upload.js";
4
+ import { type RenderImageWidgetFormFn } from "./view.js";
4
5
  export declare const addWidget: (tr: Transaction, deps: ExtensionDeps, opts: ImageWidgetDescriptorOpts) => Transaction;
5
6
  export declare const removeWidget: (tr: Transaction, id: string) => Transaction;
6
7
  export type ImageWidgetDescriptorOpts = {
7
8
  needToSetDimensionsForUploadedImages: boolean;
8
9
  uploadImages?: FileUploadHandler;
10
+ enableNewImageSizeCalculation?: boolean;
11
+ renderImageForm?: RenderImageWidgetFormFn;
9
12
  };
@@ -4,7 +4,7 @@ import { ReactWidgetDescriptor, removeDecoration } from "../../../behavior/Widge
4
4
  import { imageType, normalizeUrlFactory } from "../../../markdown/index.js";
5
5
  import { ImgSizeAttr } from "../../../specs.js";
6
6
  import { ImagesUploadProcess } from "../ImagePaste/upload.js";
7
- import { FilePlaceholder } from "./view.js";
7
+ import { ImagePlaceholder } from "./view.js";
8
8
  export const addWidget = (tr, deps, opts) => {
9
9
  return new ImageWidgetDescriptor(tr.selection.from, deps, opts).applyTo(tr);
10
10
  };
@@ -14,13 +14,17 @@ class ImageWidgetDescriptor extends ReactWidgetDescriptor {
14
14
  deps;
15
15
  uploadImages;
16
16
  needToSetDimensionsForUploadedImages;
17
+ enableNewImageSizeCalculation;
18
+ renderImageForm;
17
19
  widgetHandler = null;
18
20
  constructor(initPos, deps, opts) {
19
21
  super(initPos, 'image_placeholder');
20
22
  this.domElem = document.createElement('span');
21
23
  this.deps = deps;
22
24
  this.uploadImages = opts.uploadImages;
25
+ this.renderImageForm = opts.renderImageForm;
23
26
  this.needToSetDimensionsForUploadedImages = opts.needToSetDimensionsForUploadedImages;
27
+ this.enableNewImageSizeCalculation = opts.enableNewImageSizeCalculation;
24
28
  }
25
29
  getWidgetHandler(view, getPos) {
26
30
  if (!this.widgetHandler) {
@@ -29,7 +33,9 @@ class ImageWidgetDescriptor extends ReactWidgetDescriptor {
29
33
  getPos,
30
34
  decoId: this.id,
31
35
  uploadImages: this.uploadImages,
36
+ renderImageForm: this.renderImageForm,
32
37
  needToSetDimensionsForUploadedImages: this.needToSetDimensionsForUploadedImages,
38
+ enableNewImageSizeCalculation: this.enableNewImageSizeCalculation,
33
39
  }, this.deps);
34
40
  }
35
41
  return this.widgetHandler;
@@ -53,14 +59,18 @@ class ImageWidgetHandler {
53
59
  uploadImages;
54
60
  normalizeUrl;
55
61
  needToSetDimensionsForUploadedImages;
62
+ enableNewImageSizeCalculation;
63
+ renderImageForm;
56
64
  cancelled = false;
57
- constructor({ decoId, view, getPos, uploadImages, needToSetDimensionsForUploadedImages, }, deps) {
65
+ constructor({ decoId, view, getPos, uploadImages, renderImageForm, needToSetDimensionsForUploadedImages, enableNewImageSizeCalculation, }, deps) {
58
66
  this.decoId = decoId;
59
67
  this.view = view;
60
68
  this.getPos = getPos;
61
69
  this.uploadImages = uploadImages;
62
70
  this.normalizeUrl = normalizeUrlFactory(deps);
71
+ this.renderImageForm = renderImageForm;
63
72
  this.needToSetDimensionsForUploadedImages = needToSetDimensionsForUploadedImages;
73
+ this.enableNewImageSizeCalculation = enableNewImageSizeCalculation;
64
74
  }
65
75
  destruct() {
66
76
  this.cancelled = true;
@@ -68,7 +78,7 @@ class ImageWidgetHandler {
68
78
  renderWidgetView(view, getPos) {
69
79
  this.view = view;
70
80
  this.getPos = getPos;
71
- return (_jsx(FilePlaceholder, { onCancel: this.onCancel, onSubmit: this.onSubmit, onAttach: this.uploadImages && this.onAttach }));
81
+ return (_jsx(ImagePlaceholder, { onCancel: this.onCancel, onSubmit: this.onSubmit, onAttach: this.uploadImages && this.onAttach, renderForm: this.renderImageForm }));
72
82
  }
73
83
  onCancel = () => {
74
84
  this.cancelled = true;
@@ -97,6 +107,7 @@ class ImageWidgetHandler {
97
107
  const { view } = this;
98
108
  new ImagesUploadProcess(view, files, this.uploadImages, this.getPos(), {
99
109
  needDimensions: this.needToSetDimensionsForUploadedImages,
110
+ enableNewImageSizeCalculation: this.enableNewImageSizeCalculation,
100
111
  }).run();
101
112
  view.dispatch(removeWidget(view.state.tr, this.decoId));
102
113
  view.focus();