@gravity-ui/markdown-editor 15.22.2 → 15.24.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 (188) hide show
  1. package/build/cjs/bundle/ToolbarView.js +2 -1
  2. package/build/cjs/bundle/ToolbarView.js.map +1 -1
  3. package/build/cjs/bundle/settings/index.d.ts +2 -1
  4. package/build/cjs/bundle/settings/index.js +6 -2
  5. package/build/cjs/bundle/settings/index.js.map +1 -1
  6. package/build/cjs/bundle/toolbar/ToolbarButtonWithPopupMenu.js +4 -1
  7. package/build/cjs/bundle/toolbar/ToolbarButtonWithPopupMenu.js.map +1 -1
  8. package/build/cjs/common/layout.d.ts +3 -0
  9. package/build/cjs/common/layout.js +7 -0
  10. package/build/cjs/common/layout.js.map +1 -0
  11. package/build/cjs/extensions/base/BaseSchema/BaseSchemaSpecs/index.d.ts +1 -1
  12. package/build/cjs/extensions/base/BaseSchema/BaseSchemaSpecs/index.js +2 -2
  13. package/build/cjs/extensions/base/BaseSchema/BaseSchemaSpecs/index.js.map +1 -1
  14. package/build/cjs/extensions/markdown/Table/commands.d.ts +2 -0
  15. package/build/cjs/extensions/markdown/Table/commands.js +73 -0
  16. package/build/cjs/extensions/markdown/Table/commands.js.map +1 -0
  17. package/build/cjs/extensions/markdown/Table/helpers.d.ts +7 -2
  18. package/build/cjs/extensions/markdown/Table/helpers.js +22 -9
  19. package/build/cjs/extensions/markdown/Table/helpers.js.map +1 -1
  20. package/build/cjs/extensions/markdown/Table/index.js +3 -0
  21. package/build/cjs/extensions/markdown/Table/index.js.map +1 -1
  22. package/build/cjs/extensions/yfm/ImgSize/ImagePaste/index.js +35 -0
  23. package/build/cjs/extensions/yfm/ImgSize/ImagePaste/index.js.map +1 -1
  24. package/build/cjs/extensions/yfm/ImgSize/ImgSizeSpecs/const.d.ts +1 -0
  25. package/build/cjs/extensions/yfm/ImgSize/ImgSizeSpecs/const.js +1 -0
  26. package/build/cjs/extensions/yfm/ImgSize/ImgSizeSpecs/const.js.map +1 -1
  27. package/build/cjs/extensions/yfm/ImgSize/ImgSizeSpecs/index.js +3 -0
  28. package/build/cjs/extensions/yfm/ImgSize/ImgSizeSpecs/index.js.map +1 -1
  29. package/build/cjs/extensions/yfm/ImgSize/utils.d.ts +6 -0
  30. package/build/cjs/extensions/yfm/ImgSize/utils.js +25 -0
  31. package/build/cjs/extensions/yfm/ImgSize/utils.js.map +1 -1
  32. package/build/cjs/extensions/yfm/YfmCut/YfmCutSpecs/const.d.ts +5 -0
  33. package/build/cjs/extensions/yfm/YfmCut/YfmCutSpecs/const.js +6 -1
  34. package/build/cjs/extensions/yfm/YfmCut/YfmCutSpecs/const.js.map +1 -1
  35. package/build/cjs/extensions/yfm/YfmCut/YfmCutSpecs/index.d.ts +1 -1
  36. package/build/cjs/extensions/yfm/YfmCut/YfmCutSpecs/index.js +2 -1
  37. package/build/cjs/extensions/yfm/YfmCut/YfmCutSpecs/index.js.map +1 -1
  38. package/build/cjs/extensions/yfm/YfmCut/YfmCutSpecs/schema.d.ts +1 -1
  39. package/build/cjs/extensions/yfm/YfmCut/YfmCutSpecs/schema.js +6 -6
  40. package/build/cjs/extensions/yfm/YfmCut/YfmCutSpecs/schema.js.map +1 -1
  41. package/build/cjs/extensions/yfm/YfmCut/actions/toYfmCut.d.ts +1 -1
  42. package/build/cjs/extensions/yfm/YfmCut/actions/toYfmCut.js +6 -6
  43. package/build/cjs/extensions/yfm/YfmCut/actions/toYfmCut.js.map +1 -1
  44. package/build/cjs/extensions/yfm/YfmCut/const.d.ts +9 -1
  45. package/build/cjs/extensions/yfm/YfmCut/const.js +13 -6
  46. package/build/cjs/extensions/yfm/YfmCut/const.js.map +1 -1
  47. package/build/cjs/extensions/yfm/YfmCut/index.css +0 -3
  48. package/build/cjs/extensions/yfm/YfmCut/nodeviews/yfm-cut-title.css +6 -5
  49. package/build/cjs/extensions/yfm/YfmCut/nodeviews/yfm-cut-title.d.ts +5 -2
  50. package/build/cjs/extensions/yfm/YfmCut/nodeviews/yfm-cut-title.js +26 -9
  51. package/build/cjs/extensions/yfm/YfmCut/nodeviews/yfm-cut-title.js.map +1 -1
  52. package/build/cjs/extensions/yfm/YfmCut/plugins/active.d.ts +1 -1
  53. package/build/cjs/extensions/yfm/YfmCut/plugins/active.js +6 -7
  54. package/build/cjs/extensions/yfm/YfmCut/plugins/active.js.map +1 -1
  55. package/build/cjs/extensions/yfm/YfmCut/plugins/auto-open.d.ts +1 -1
  56. package/build/cjs/extensions/yfm/YfmCut/plugins/auto-open.js +8 -9
  57. package/build/cjs/extensions/yfm/YfmCut/plugins/auto-open.js.map +1 -1
  58. package/build/cjs/extensions/yfm/YfmTable/commands/backspace.d.ts +1 -1
  59. package/build/cjs/extensions/yfm/YfmTable/commands/backspace.js +61 -84
  60. package/build/cjs/extensions/yfm/YfmTable/commands/backspace.js.map +1 -1
  61. package/build/cjs/i18n/search/en.json +5 -2
  62. package/build/cjs/i18n/search/index.d.ts +4 -1
  63. package/build/cjs/i18n/search/ru.json +5 -2
  64. package/build/cjs/markup/codemirror/search-plugin/plugin.d.ts +2 -0
  65. package/build/cjs/markup/codemirror/search-plugin/plugin.js +13 -0
  66. package/build/cjs/markup/codemirror/search-plugin/plugin.js.map +1 -1
  67. package/build/cjs/markup/codemirror/search-plugin/view/ReplaceIcons.d.ts +3 -0
  68. package/build/cjs/markup/codemirror/search-plugin/view/ReplaceIcons.js +9 -0
  69. package/build/cjs/markup/codemirror/search-plugin/view/ReplaceIcons.js.map +1 -0
  70. package/build/cjs/markup/codemirror/search-plugin/view/SearchPopup.css +1 -0
  71. package/build/cjs/markup/codemirror/search-plugin/view/SearchPopup.d.ts +2 -0
  72. package/build/cjs/markup/codemirror/search-plugin/view/SearchPopup.js +12 -2
  73. package/build/cjs/markup/codemirror/search-plugin/view/SearchPopup.js.map +1 -1
  74. package/build/cjs/react-utils/index.d.ts +1 -0
  75. package/build/cjs/react-utils/index.js +1 -0
  76. package/build/cjs/react-utils/index.js.map +1 -1
  77. package/build/cjs/react-utils/useSticky.js +13 -2
  78. package/build/cjs/react-utils/useSticky.js.map +1 -1
  79. package/build/cjs/react-utils/useTargetZIndex.d.ts +1 -0
  80. package/build/cjs/react-utils/useTargetZIndex.js +50 -0
  81. package/build/cjs/react-utils/useTargetZIndex.js.map +1 -0
  82. package/build/cjs/toolbar/ToolbarListButton.js +4 -1
  83. package/build/cjs/toolbar/ToolbarListButton.js.map +1 -1
  84. package/build/cjs/utils/get-target-z-index.d.ts +1 -0
  85. package/build/cjs/utils/get-target-z-index.js +17 -0
  86. package/build/cjs/utils/get-target-z-index.js.map +1 -0
  87. package/build/cjs/utils/inputrules.d.ts +1 -0
  88. package/build/cjs/utils/inputrules.js +8 -3
  89. package/build/cjs/utils/inputrules.js.map +1 -1
  90. package/build/cjs/utils/rulebuilders.js +2 -0
  91. package/build/cjs/utils/rulebuilders.js.map +1 -1
  92. package/build/cjs/version.js +1 -1
  93. package/build/cjs/version.js.map +1 -1
  94. package/build/esm/bundle/ToolbarView.js +2 -1
  95. package/build/esm/bundle/ToolbarView.js.map +1 -1
  96. package/build/esm/bundle/settings/index.d.ts +2 -1
  97. package/build/esm/bundle/settings/index.js +6 -2
  98. package/build/esm/bundle/settings/index.js.map +1 -1
  99. package/build/esm/bundle/toolbar/ToolbarButtonWithPopupMenu.js +4 -1
  100. package/build/esm/bundle/toolbar/ToolbarButtonWithPopupMenu.js.map +1 -1
  101. package/build/esm/common/layout.d.ts +3 -0
  102. package/build/esm/common/layout.js +4 -0
  103. package/build/esm/common/layout.js.map +1 -0
  104. package/build/esm/extensions/base/BaseSchema/BaseSchemaSpecs/index.d.ts +1 -1
  105. package/build/esm/extensions/base/BaseSchema/BaseSchemaSpecs/index.js +1 -1
  106. package/build/esm/extensions/base/BaseSchema/BaseSchemaSpecs/index.js.map +1 -1
  107. package/build/esm/extensions/markdown/Table/commands.d.ts +2 -0
  108. package/build/esm/extensions/markdown/Table/commands.js +69 -0
  109. package/build/esm/extensions/markdown/Table/commands.js.map +1 -0
  110. package/build/esm/extensions/markdown/Table/helpers.d.ts +7 -2
  111. package/build/esm/extensions/markdown/Table/helpers.js +9 -3
  112. package/build/esm/extensions/markdown/Table/helpers.js.map +1 -1
  113. package/build/esm/extensions/markdown/Table/index.js +3 -0
  114. package/build/esm/extensions/markdown/Table/index.js.map +1 -1
  115. package/build/esm/extensions/yfm/ImgSize/ImagePaste/index.js +36 -1
  116. package/build/esm/extensions/yfm/ImgSize/ImagePaste/index.js.map +1 -1
  117. package/build/esm/extensions/yfm/ImgSize/ImgSizeSpecs/const.d.ts +1 -0
  118. package/build/esm/extensions/yfm/ImgSize/ImgSizeSpecs/const.js +1 -0
  119. package/build/esm/extensions/yfm/ImgSize/ImgSizeSpecs/const.js.map +1 -1
  120. package/build/esm/extensions/yfm/ImgSize/ImgSizeSpecs/index.js +3 -0
  121. package/build/esm/extensions/yfm/ImgSize/ImgSizeSpecs/index.js.map +1 -1
  122. package/build/esm/extensions/yfm/ImgSize/utils.d.ts +6 -0
  123. package/build/esm/extensions/yfm/ImgSize/utils.js +22 -0
  124. package/build/esm/extensions/yfm/ImgSize/utils.js.map +1 -1
  125. package/build/esm/extensions/yfm/YfmCut/YfmCutSpecs/const.d.ts +5 -0
  126. package/build/esm/extensions/yfm/YfmCut/YfmCutSpecs/const.js +5 -0
  127. package/build/esm/extensions/yfm/YfmCut/YfmCutSpecs/const.js.map +1 -1
  128. package/build/esm/extensions/yfm/YfmCut/YfmCutSpecs/index.d.ts +1 -1
  129. package/build/esm/extensions/yfm/YfmCut/YfmCutSpecs/index.js +1 -1
  130. package/build/esm/extensions/yfm/YfmCut/YfmCutSpecs/index.js.map +1 -1
  131. package/build/esm/extensions/yfm/YfmCut/YfmCutSpecs/schema.d.ts +1 -1
  132. package/build/esm/extensions/yfm/YfmCut/YfmCutSpecs/schema.js +7 -7
  133. package/build/esm/extensions/yfm/YfmCut/YfmCutSpecs/schema.js.map +1 -1
  134. package/build/esm/extensions/yfm/YfmCut/actions/toYfmCut.d.ts +1 -1
  135. package/build/esm/extensions/yfm/YfmCut/actions/toYfmCut.js +5 -5
  136. package/build/esm/extensions/yfm/YfmCut/actions/toYfmCut.js.map +1 -1
  137. package/build/esm/extensions/yfm/YfmCut/const.d.ts +9 -1
  138. package/build/esm/extensions/yfm/YfmCut/const.js +8 -1
  139. package/build/esm/extensions/yfm/YfmCut/const.js.map +1 -1
  140. package/build/esm/extensions/yfm/YfmCut/index.css +0 -3
  141. package/build/esm/extensions/yfm/YfmCut/nodeviews/yfm-cut-title.css +6 -5
  142. package/build/esm/extensions/yfm/YfmCut/nodeviews/yfm-cut-title.d.ts +5 -2
  143. package/build/esm/extensions/yfm/YfmCut/nodeviews/yfm-cut-title.js +26 -9
  144. package/build/esm/extensions/yfm/YfmCut/nodeviews/yfm-cut-title.js.map +1 -1
  145. package/build/esm/extensions/yfm/YfmCut/plugins/active.d.ts +1 -1
  146. package/build/esm/extensions/yfm/YfmCut/plugins/active.js +4 -5
  147. package/build/esm/extensions/yfm/YfmCut/plugins/active.js.map +1 -1
  148. package/build/esm/extensions/yfm/YfmCut/plugins/auto-open.d.ts +1 -1
  149. package/build/esm/extensions/yfm/YfmCut/plugins/auto-open.js +6 -7
  150. package/build/esm/extensions/yfm/YfmCut/plugins/auto-open.js.map +1 -1
  151. package/build/esm/extensions/yfm/YfmTable/commands/backspace.d.ts +1 -1
  152. package/build/esm/extensions/yfm/YfmTable/commands/backspace.js +60 -83
  153. package/build/esm/extensions/yfm/YfmTable/commands/backspace.js.map +1 -1
  154. package/build/esm/i18n/search/en.json +5 -2
  155. package/build/esm/i18n/search/index.d.ts +4 -1
  156. package/build/esm/i18n/search/ru.json +5 -2
  157. package/build/esm/markup/codemirror/search-plugin/plugin.d.ts +2 -0
  158. package/build/esm/markup/codemirror/search-plugin/plugin.js +14 -1
  159. package/build/esm/markup/codemirror/search-plugin/plugin.js.map +1 -1
  160. package/build/esm/markup/codemirror/search-plugin/view/ReplaceIcons.d.ts +3 -0
  161. package/build/esm/markup/codemirror/search-plugin/view/ReplaceIcons.js +4 -0
  162. package/build/esm/markup/codemirror/search-plugin/view/ReplaceIcons.js.map +1 -0
  163. package/build/esm/markup/codemirror/search-plugin/view/SearchPopup.css +1 -0
  164. package/build/esm/markup/codemirror/search-plugin/view/SearchPopup.d.ts +2 -0
  165. package/build/esm/markup/codemirror/search-plugin/view/SearchPopup.js +12 -2
  166. package/build/esm/markup/codemirror/search-plugin/view/SearchPopup.js.map +1 -1
  167. package/build/esm/react-utils/index.d.ts +1 -0
  168. package/build/esm/react-utils/index.js +1 -0
  169. package/build/esm/react-utils/index.js.map +1 -1
  170. package/build/esm/react-utils/useSticky.js +13 -2
  171. package/build/esm/react-utils/useSticky.js.map +1 -1
  172. package/build/esm/react-utils/useTargetZIndex.d.ts +1 -0
  173. package/build/esm/react-utils/useTargetZIndex.js +47 -0
  174. package/build/esm/react-utils/useTargetZIndex.js.map +1 -0
  175. package/build/esm/toolbar/ToolbarListButton.js +4 -1
  176. package/build/esm/toolbar/ToolbarListButton.js.map +1 -1
  177. package/build/esm/utils/get-target-z-index.d.ts +1 -0
  178. package/build/esm/utils/get-target-z-index.js +14 -0
  179. package/build/esm/utils/get-target-z-index.js.map +1 -0
  180. package/build/esm/utils/inputrules.d.ts +1 -0
  181. package/build/esm/utils/inputrules.js +5 -1
  182. package/build/esm/utils/inputrules.js.map +1 -1
  183. package/build/esm/utils/rulebuilders.js +3 -1
  184. package/build/esm/utils/rulebuilders.js.map +1 -1
  185. package/build/esm/version.js +1 -1
  186. package/build/esm/version.js.map +1 -1
  187. package/build/styles.css +7 -8
  188. package/package.json +2 -2
@@ -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 {InputState} from 'src/utils/input-state';\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 const inputState = new InputState();\n\n builder.addPlugin(\n () =>\n new Plugin({\n props: {\n handleDOMEvents: {\n keydown(_view, e) {\n inputState.keydown(e);\n },\n keyup(_view, e) {\n inputState.keyup(e);\n },\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 (!inputState.shiftKey && 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
+ {"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 {InputState} from 'src/utils/input-state';\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 {\n type CreateImageNodeOptions,\n checkSvg,\n findImageNode,\n getImageSize,\n getImageSizeNew,\n isImageNode,\n loadImageFromUrl,\n} 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 const inputState = new InputState();\n\n builder.addPlugin(\n () =>\n new Plugin({\n props: {\n handleDOMEvents: {\n keydown(_view, e) {\n inputState.keydown(e);\n },\n keyup(_view, e) {\n inputState.keyup(e);\n },\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 (!inputState.shiftKey && 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 isSvg = checkSvg(imageUrl);\n\n const trackingId = `img-${Math.random().toString(36).slice(2)}`;\n\n const imageNode = imageType(view.state.schema).create({\n src: imageUrl,\n alt: title,\n id: trackingId,\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 loadImageFromUrl(imageUrl)\n .then((img) =>\n opts?.enableNewImageSizeCalculation || isSvg\n ? getImageSizeNew(img)\n : getImageSize(img),\n )\n .then(\n (sizes: {\n [ImgSizeAttr.Height]?: string;\n [ImgSizeAttr.Width]?: string;\n }) => {\n const currentState = view.state;\n\n const imageResult = findImageNode(\n currentState.doc,\n trackingId,\n );\n\n if (imageResult === null) {\n logger.error({\n event: 'img-node-not-found',\n trackingId,\n });\n return;\n }\n\n const {pos: targetPos} = imageResult;\n\n const updateTr = currentState.tr\n .setNodeAttribute(\n targetPos,\n ImgSizeAttr.Height,\n sizes.height,\n )\n .setNodeAttribute(\n targetPos,\n ImgSizeAttr.Width,\n sizes.width,\n )\n .setNodeAttribute(targetPos, 'id', null);\n\n view.dispatch(updateTr);\n\n logger.event({\n event: 'img-dimensions-updated',\n position: targetPos,\n sizes,\n });\n },\n )\n .catch((error) => {\n logger.error({\n event: 'img-dimensions-load-failed',\n error: error.message,\n });\n });\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"]}
@@ -6,4 +6,5 @@ export declare const ImgSizeAttr: {
6
6
  readonly Width: ImsizeAttr.Width;
7
7
  readonly Height: ImsizeAttr.Height;
8
8
  readonly Loading: "loading";
9
+ readonly Id: "id";
9
10
  };
@@ -6,5 +6,6 @@ export const ImgSizeAttr = {
6
6
  Width: ImsizeAttr.Width,
7
7
  Height: ImsizeAttr.Height,
8
8
  Loading: 'loading',
9
+ Id: 'id',
9
10
  };
10
11
  //# sourceMappingURL=const.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"const.js","sourceRoot":"../../../../../../src","sources":["extensions/yfm/ImgSize/ImgSizeSpecs/const.ts"],"names":[],"mappings":"AAAA,OAAO,EAAC,UAAU,EAAC,MAAM,iDAAiD,CAAC;AAE3E,MAAM,CAAC,MAAM,WAAW,GAAG;IACvB,GAAG,EAAE,UAAU,CAAC,GAAG;IACnB,GAAG,EAAE,UAAU,CAAC,GAAG;IACnB,KAAK,EAAE,UAAU,CAAC,KAAK;IACvB,KAAK,EAAE,UAAU,CAAC,KAAK;IACvB,MAAM,EAAE,UAAU,CAAC,MAAM;IACzB,OAAO,EAAE,SAAS;CACZ,CAAC","sourcesContent":["import {ImsizeAttr} from '@diplodoc/transform/lib/plugins/imsize/const.js';\n\nexport const ImgSizeAttr = {\n Alt: ImsizeAttr.Alt,\n Src: ImsizeAttr.Src,\n Title: ImsizeAttr.Title,\n Width: ImsizeAttr.Width,\n Height: ImsizeAttr.Height,\n Loading: 'loading',\n} as const;\n"]}
1
+ {"version":3,"file":"const.js","sourceRoot":"../../../../../../src","sources":["extensions/yfm/ImgSize/ImgSizeSpecs/const.ts"],"names":[],"mappings":"AAAA,OAAO,EAAC,UAAU,EAAC,MAAM,iDAAiD,CAAC;AAE3E,MAAM,CAAC,MAAM,WAAW,GAAG;IACvB,GAAG,EAAE,UAAU,CAAC,GAAG;IACnB,GAAG,EAAE,UAAU,CAAC,GAAG;IACnB,KAAK,EAAE,UAAU,CAAC,KAAK;IACvB,KAAK,EAAE,UAAU,CAAC,KAAK;IACvB,MAAM,EAAE,UAAU,CAAC,MAAM;IACzB,OAAO,EAAE,SAAS;IAClB,EAAE,EAAE,IAAI;CACF,CAAC","sourcesContent":["import {ImsizeAttr} from '@diplodoc/transform/lib/plugins/imsize/const.js';\n\nexport const ImgSizeAttr = {\n Alt: ImsizeAttr.Alt,\n Src: ImsizeAttr.Src,\n Title: ImsizeAttr.Title,\n Width: ImsizeAttr.Width,\n Height: ImsizeAttr.Height,\n Loading: 'loading',\n Id: 'id',\n} as const;\n"]}
@@ -17,6 +17,7 @@ export const ImgSizeSpecs = (builder, opts) => {
17
17
  [ImgSizeAttr.Height]: { default: null },
18
18
  [ImgSizeAttr.Width]: { default: null },
19
19
  [ImgSizeAttr.Loading]: { default: null },
20
+ [ImgSizeAttr.Id]: { default: null },
20
21
  },
21
22
  placeholder: placeholderContent ? { content: placeholderContent } : opts.placeholder,
22
23
  group: 'inline',
@@ -34,6 +35,7 @@ export const ImgSizeSpecs = (builder, opts) => {
34
35
  [ImgSizeAttr.Loading]: dom.getAttribute(ImgSizeAttr.Loading),
35
36
  [ImgSizeAttr.Height]: isNumber(height) ? height : null,
36
37
  [ImgSizeAttr.Width]: isNumber(width) ? height : null,
38
+ [ImgSizeAttr.Id]: dom.getAttribute(ImgSizeAttr.Id),
37
39
  };
38
40
  },
39
41
  },
@@ -53,6 +55,7 @@ export const ImgSizeSpecs = (builder, opts) => {
53
55
  [ImgSizeAttr.Width]: tok.attrGet(ImgSizeAttr.Width),
54
56
  [ImgSizeAttr.Loading]: tok.attrGet(ImgSizeAttr.Loading),
55
57
  [ImgSizeAttr.Alt]: tok.children?.[0]?.content || null,
58
+ [ImgSizeAttr.Id]: tok.attrGet(ImgSizeAttr.Id),
56
59
  }),
57
60
  },
58
61
  },
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"../../../../../../src","sources":["extensions/yfm/ImgSize/ImgSizeSpecs/index.ts"],"names":[],"mappings":"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","sourcesContent":["import {log} from '@diplodoc/transform/lib/log.js';\nimport imsize from '@diplodoc/transform/lib/plugins/imsize/index.js';\nimport isNumber from 'is-number';\nimport type {NodeSpec} from 'prosemirror-model';\n\nimport type {ExtensionAuto} from '../../../../core';\nimport {imageNodeName} from '../../../markdown/Image/const';\n\nimport {ImgSizeAttr} from './const';\n\ntype ImsizeTypedAttributes = {\n [ImgSizeAttr.Src]: string;\n [ImgSizeAttr.Title]: string | null;\n [ImgSizeAttr.Alt]: string | null;\n [ImgSizeAttr.Width]: string | null;\n [ImgSizeAttr.Height]: string | null;\n [ImgSizeAttr.Loading]: string | null;\n};\n\nexport {ImgSizeAttr};\n\nexport type ImgSizeSpecsOptions = {\n /**\n * @deprecated: use placeholder option in BehaviorPreset instead.\n */\n placeholder?: NodeSpec['placeholder'];\n};\n\nexport const ImgSizeSpecs: ExtensionAuto<ImgSizeSpecsOptions> = (builder, opts) => {\n const placeholderContent = builder.context.get('placeholder')?.imgSize;\n\n builder.configureMd((md) => md.use(imsize, {log, enableInlineStyling: true}));\n builder.addNode(imageNodeName, () => ({\n spec: {\n inline: true,\n attrs: {\n [ImgSizeAttr.Src]: {},\n [ImgSizeAttr.Alt]: {default: null},\n [ImgSizeAttr.Title]: {default: null},\n [ImgSizeAttr.Height]: {default: null},\n [ImgSizeAttr.Width]: {default: null},\n [ImgSizeAttr.Loading]: {default: null},\n },\n placeholder: placeholderContent ? {content: placeholderContent} : opts.placeholder,\n group: 'inline',\n draggable: true,\n parseDOM: [\n {\n tag: 'img[src]',\n getAttrs(dom) {\n const height = (dom as Element).getAttribute(ImgSizeAttr.Height);\n const width = (dom as Element).getAttribute(ImgSizeAttr.Width);\n\n return {\n [ImgSizeAttr.Src]: (dom as Element).getAttribute(ImgSizeAttr.Src),\n [ImgSizeAttr.Alt]: (dom as Element).getAttribute(ImgSizeAttr.Alt),\n [ImgSizeAttr.Title]: (dom as Element).getAttribute(ImgSizeAttr.Title),\n [ImgSizeAttr.Loading]: (dom as Element).getAttribute(\n ImgSizeAttr.Loading,\n ),\n [ImgSizeAttr.Height]: isNumber(height) ? height : null,\n [ImgSizeAttr.Width]: isNumber(width) ? height : null,\n };\n },\n },\n ],\n toDOM(node) {\n return ['img', node.attrs];\n },\n },\n fromMd: {\n tokenSpec: {\n name: imageNodeName,\n type: 'node',\n getAttrs: (tok): ImsizeTypedAttributes => ({\n [ImgSizeAttr.Src]: tok.attrGet(ImgSizeAttr.Src)!,\n [ImgSizeAttr.Title]: tok.attrGet(ImgSizeAttr.Title),\n [ImgSizeAttr.Height]: tok.attrGet(ImgSizeAttr.Height),\n [ImgSizeAttr.Width]: tok.attrGet(ImgSizeAttr.Width),\n [ImgSizeAttr.Loading]: tok.attrGet(ImgSizeAttr.Loading),\n [ImgSizeAttr.Alt]: tok.children?.[0]?.content || null,\n }),\n },\n },\n toMd: (state, node) => {\n const attrs = node.attrs as ImsizeTypedAttributes;\n let result = '![';\n\n if (attrs.alt) {\n result += state.esc(attrs.alt);\n }\n\n result += '](';\n\n if (attrs.src) {\n result += state.esc(attrs.src);\n }\n\n if (attrs.title) {\n result += ` ${state.quote(attrs.title)}`;\n }\n\n result += getSize(attrs);\n result += ')';\n\n state.write(result);\n },\n }));\n};\n\nfunction getSize({width, height}: ImsizeTypedAttributes): string {\n if (width || height) {\n return ` =${width || ''}x${height || ''}`;\n }\n\n return '';\n}\n"]}
1
+ {"version":3,"file":"index.js","sourceRoot":"../../../../../../src","sources":["extensions/yfm/ImgSize/ImgSizeSpecs/index.ts"],"names":[],"mappings":"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","sourcesContent":["import {log} from '@diplodoc/transform/lib/log.js';\nimport imsize from '@diplodoc/transform/lib/plugins/imsize/index.js';\nimport isNumber from 'is-number';\nimport type {NodeSpec} from 'prosemirror-model';\n\nimport type {ExtensionAuto} from '../../../../core';\nimport {imageNodeName} from '../../../markdown/Image/const';\n\nimport {ImgSizeAttr} from './const';\n\ntype ImsizeTypedAttributes = {\n [ImgSizeAttr.Src]: string;\n [ImgSizeAttr.Title]: string | null;\n [ImgSizeAttr.Alt]: string | null;\n [ImgSizeAttr.Width]: string | null;\n [ImgSizeAttr.Height]: string | null;\n [ImgSizeAttr.Loading]: string | null;\n [ImgSizeAttr.Id]: string | null;\n};\n\nexport {ImgSizeAttr};\n\nexport type ImgSizeSpecsOptions = {\n /**\n * @deprecated: use placeholder option in BehaviorPreset instead.\n */\n placeholder?: NodeSpec['placeholder'];\n};\n\nexport const ImgSizeSpecs: ExtensionAuto<ImgSizeSpecsOptions> = (builder, opts) => {\n const placeholderContent = builder.context.get('placeholder')?.imgSize;\n\n builder.configureMd((md) => md.use(imsize, {log, enableInlineStyling: true}));\n builder.addNode(imageNodeName, () => ({\n spec: {\n inline: true,\n attrs: {\n [ImgSizeAttr.Src]: {},\n [ImgSizeAttr.Alt]: {default: null},\n [ImgSizeAttr.Title]: {default: null},\n [ImgSizeAttr.Height]: {default: null},\n [ImgSizeAttr.Width]: {default: null},\n [ImgSizeAttr.Loading]: {default: null},\n [ImgSizeAttr.Id]: {default: null},\n },\n placeholder: placeholderContent ? {content: placeholderContent} : opts.placeholder,\n group: 'inline',\n draggable: true,\n parseDOM: [\n {\n tag: 'img[src]',\n getAttrs(dom) {\n const height = (dom as Element).getAttribute(ImgSizeAttr.Height);\n const width = (dom as Element).getAttribute(ImgSizeAttr.Width);\n\n return {\n [ImgSizeAttr.Src]: (dom as Element).getAttribute(ImgSizeAttr.Src),\n [ImgSizeAttr.Alt]: (dom as Element).getAttribute(ImgSizeAttr.Alt),\n [ImgSizeAttr.Title]: (dom as Element).getAttribute(ImgSizeAttr.Title),\n [ImgSizeAttr.Loading]: (dom as Element).getAttribute(\n ImgSizeAttr.Loading,\n ),\n [ImgSizeAttr.Height]: isNumber(height) ? height : null,\n [ImgSizeAttr.Width]: isNumber(width) ? height : null,\n [ImgSizeAttr.Id]: (dom as Element).getAttribute(ImgSizeAttr.Id),\n };\n },\n },\n ],\n toDOM(node) {\n return ['img', node.attrs];\n },\n },\n fromMd: {\n tokenSpec: {\n name: imageNodeName,\n type: 'node',\n getAttrs: (tok): ImsizeTypedAttributes => ({\n [ImgSizeAttr.Src]: tok.attrGet(ImgSizeAttr.Src)!,\n [ImgSizeAttr.Title]: tok.attrGet(ImgSizeAttr.Title),\n [ImgSizeAttr.Height]: tok.attrGet(ImgSizeAttr.Height),\n [ImgSizeAttr.Width]: tok.attrGet(ImgSizeAttr.Width),\n [ImgSizeAttr.Loading]: tok.attrGet(ImgSizeAttr.Loading),\n [ImgSizeAttr.Alt]: tok.children?.[0]?.content || null,\n [ImgSizeAttr.Id]: tok.attrGet(ImgSizeAttr.Id),\n }),\n },\n },\n toMd: (state, node) => {\n const attrs = node.attrs as ImsizeTypedAttributes;\n let result = '![';\n\n if (attrs.alt) {\n result += state.esc(attrs.alt);\n }\n\n result += '](';\n\n if (attrs.src) {\n result += state.esc(attrs.src);\n }\n\n if (attrs.title) {\n result += ` ${state.quote(attrs.title)}`;\n }\n\n result += getSize(attrs);\n result += ')';\n\n state.write(result);\n },\n }));\n};\n\nfunction getSize({width, height}: ImsizeTypedAttributes): string {\n if (width || height) {\n return ` =${width || ''}x${height || ''}`;\n }\n\n return '';\n}\n"]}
@@ -9,6 +9,7 @@ export type CreateImageNodeOptions = {
9
9
  };
10
10
  export declare const createImageNode: (imgType: NodeType, opts: CreateImageNodeOptions, logger: Logger2.ILogger) => ({ result, file }: UploadSuccessItem) => Promise<Node>;
11
11
  export declare function loadImage(imgFile: File): Promise<HTMLImageElement>;
12
+ export declare function loadImageFromUrl(url: string): Promise<HTMLImageElement>;
12
13
  export declare function getImageSize(img: HTMLImageElement): {
13
14
  [ImgSizeAttr.Height]?: string;
14
15
  };
@@ -16,3 +17,8 @@ export declare function getImageSizeNew({ width, height }: HTMLImageElement): {
16
17
  [ImgSizeAttr.Width]?: string;
17
18
  [ImgSizeAttr.Height]?: string;
18
19
  };
20
+ export declare function checkSvg(imageUrl?: string): boolean | "" | undefined;
21
+ export declare function findImageNode(doc: Node, id: string): {
22
+ node: Node;
23
+ pos: number;
24
+ } | null;
@@ -34,6 +34,14 @@ export async function loadImage(imgFile) {
34
34
  img.onerror = (_e, _s, _l, _c, error) => reject(error);
35
35
  });
36
36
  }
37
+ export async function loadImageFromUrl(url) {
38
+ return new Promise((resolve, reject) => {
39
+ const img = new Image();
40
+ img.onload = () => resolve(img);
41
+ img.onerror = (_e, _s, _l, _c, error) => reject(error);
42
+ img.src = url;
43
+ });
44
+ }
37
45
  export function getImageSize(img) {
38
46
  return { height: String(Math.min(IMG_MAX_HEIGHT, img.height)) };
39
47
  }
@@ -45,4 +53,18 @@ export function getImageSizeNew({ width, height }) {
45
53
  });
46
54
  return { width: String(size.width), height: String(size.height) };
47
55
  }
56
+ export function checkSvg(imageUrl) {
57
+ return imageUrl && (/\.svg($|\?|#)/i.test(imageUrl) || imageUrl.startsWith('data:image/svg'));
58
+ }
59
+ export function findImageNode(doc, id) {
60
+ let result = null;
61
+ doc.descendants((node, pos) => {
62
+ if (isImageNode(node) && node.attrs.id === id) {
63
+ result = { node, pos };
64
+ return false;
65
+ }
66
+ return true;
67
+ });
68
+ return result;
69
+ }
48
70
  //# sourceMappingURL=utils.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"utils.js","sourceRoot":"../../../../../src","sources":["extensions/yfm/ImgSize/utils.ts"],"names":[],"mappings":"AAEA,OAAO,EAAe,YAAY,EAAC,2BAAwB;AAC3D,OAAO,EAAyB,mBAAmB,EAAC,gCAAuB;AAC3E,OAAO,EAAC,aAAa,EAAC,gCAAuB;AAC7C,OAAO,EAAC,WAAW,EAAC,uBAAoB;AAExC,OAAO,EAAC,cAAc,EAAC,mBAAgB;AAEvC,MAAM,UAAU,WAAW,CAAC,IAAU;IAClC,OAAO,IAAI,CAAC,IAAI,CAAC,IAAI,KAAK,aAAa,CAAC;AAC5C,CAAC;AAOD,MAAM,CAAC,MAAM,eAAe,GACxB,CAAC,OAAiB,EAAE,IAA4B,EAAE,MAAuB,EAAE,EAAE,CAC7E,KAAK,EAAE,EAAC,MAAM,EAAE,IAAI,EAAoB,EAAE,EAAE;IACxC,MAAM,KAAK,GAA2B;QAClC,CAAC,WAAW,CAAC,GAAG,CAAC,EAAE,MAAM,CAAC,GAAG;QAC7B,CAAC,WAAW,CAAC,GAAG,CAAC,EAAE,MAAM,CAAC,IAAI,IAAI,IAAI,CAAC,IAAI;KAC9C,CAAC;IACF,IAAI,IAAI,CAAC,cAAc,EAAE,CAAC;QACtB,IAAI,CAAC;YACD,MAAM,KAAK,GAAG,MAAM,SAAS,CAAC,IAAI,CAAC,CAAC,IAAI,CACpC,IAAI,CAAC,6BAA6B,CAAC,CAAC,CAAC,eAAe,CAAC,CAAC,CAAC,YAAY,CACtE,CAAC;YACF,MAAM,CAAC,MAAM,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC;QAChC,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,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;AACjC,CAAC,CAAC;AAEN,MAAM,CAAC,KAAK,UAAU,SAAS,CAAC,OAAa;IACzC,OAAO,IAAI,OAAO,CAAmB,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;QACrD,MAAM,GAAG,GAAG,QAAQ,CAAC,aAAa,CAAC,KAAK,CAAC,CAAC;QAC1C,GAAG,CAAC,GAAG,GAAG,GAAG,CAAC,eAAe,CAAC,OAAO,CAAC,CAAC;QACvC,GAAG,CAAC,MAAM,GAAG,GAAG,EAAE;YACd,GAAG,CAAC,eAAe,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;YAC7B,OAAO,CAAC,GAAG,CAAC,CAAC;QACjB,CAAC,CAAC;QACF,GAAG,CAAC,OAAO,GAAG,CAAC,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,KAAK,EAAE,EAAE,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;IAC3D,CAAC,CAAC,CAAC;AACP,CAAC;AAED,MAAM,UAAU,YAAY,CAAC,GAAqB;IAC9C,OAAO,EAAC,MAAM,EAAE,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,cAAc,EAAE,GAAG,CAAC,MAAM,CAAC,CAAC,EAAC,CAAC;AAClE,CAAC;AAED,MAAM,UAAU,eAAe,CAAC,EAAC,KAAK,EAAE,MAAM,EAAmB;IAI7D,MAAM,IAAI,GAAG,mBAAmB,CAAC;QAC7B,KAAK;QACL,MAAM;QACN,YAAY,EAAE,cAAc;KAC/B,CAAC,CAAC;IACH,OAAO,EAAC,KAAK,EAAE,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,MAAM,EAAE,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,EAAC,CAAC;AACpE,CAAC","sourcesContent":["import type {Node, NodeType} from 'prosemirror-model';\n\nimport {type Logger2, globalLogger} from '../../../logger';\nimport {type UploadSuccessItem, getProportionalSize} from '../../../utils';\nimport {imageNodeName} from '../../markdown';\nimport {ImgSizeAttr} from '../../specs';\n\nimport {IMG_MAX_HEIGHT} from './const';\n\nexport function isImageNode(node: Node): boolean {\n return node.type.name === imageNodeName;\n}\n\nexport type CreateImageNodeOptions = {\n needDimensions: boolean;\n enableNewImageSizeCalculation?: boolean;\n};\n\nexport const createImageNode =\n (imgType: NodeType, opts: CreateImageNodeOptions, logger: Logger2.ILogger) =>\n async ({result, file}: UploadSuccessItem) => {\n const attrs: Record<string, string> = {\n [ImgSizeAttr.Src]: result.url,\n [ImgSizeAttr.Alt]: result.name ?? file.name,\n };\n if (opts.needDimensions) {\n try {\n const sizes = await loadImage(file).then(\n opts.enableNewImageSizeCalculation ? getImageSizeNew : getImageSize,\n );\n Object.assign(attrs, sizes);\n } catch (err) {\n globalLogger.error(err);\n logger.error({error: err});\n }\n }\n return imgType.create(attrs);\n };\n\nexport async function loadImage(imgFile: File) {\n return new Promise<HTMLImageElement>((resolve, reject) => {\n const img = document.createElement('img');\n img.src = URL.createObjectURL(imgFile);\n img.onload = () => {\n URL.revokeObjectURL(img.src);\n resolve(img);\n };\n img.onerror = (_e, _s, _l, _c, error) => reject(error);\n });\n}\n\nexport function getImageSize(img: HTMLImageElement): {[ImgSizeAttr.Height]?: string} {\n return {height: String(Math.min(IMG_MAX_HEIGHT, img.height))};\n}\n\nexport function getImageSizeNew({width, height}: HTMLImageElement): {\n [ImgSizeAttr.Width]?: string;\n [ImgSizeAttr.Height]?: string;\n} {\n const size = getProportionalSize({\n width,\n height,\n imgMaxHeight: IMG_MAX_HEIGHT,\n });\n return {width: String(size.width), height: String(size.height)};\n}\n"]}
1
+ {"version":3,"file":"utils.js","sourceRoot":"../../../../../src","sources":["extensions/yfm/ImgSize/utils.ts"],"names":[],"mappings":"AAEA,OAAO,EAAe,YAAY,EAAC,2BAAwB;AAC3D,OAAO,EAAyB,mBAAmB,EAAC,gCAAuB;AAC3E,OAAO,EAAC,aAAa,EAAC,gCAAuB;AAC7C,OAAO,EAAC,WAAW,EAAC,uBAAoB;AAExC,OAAO,EAAC,cAAc,EAAC,mBAAgB;AAEvC,MAAM,UAAU,WAAW,CAAC,IAAU;IAClC,OAAO,IAAI,CAAC,IAAI,CAAC,IAAI,KAAK,aAAa,CAAC;AAC5C,CAAC;AAOD,MAAM,CAAC,MAAM,eAAe,GACxB,CAAC,OAAiB,EAAE,IAA4B,EAAE,MAAuB,EAAE,EAAE,CAC7E,KAAK,EAAE,EAAC,MAAM,EAAE,IAAI,EAAoB,EAAE,EAAE;IACxC,MAAM,KAAK,GAA2B;QAClC,CAAC,WAAW,CAAC,GAAG,CAAC,EAAE,MAAM,CAAC,GAAG;QAC7B,CAAC,WAAW,CAAC,GAAG,CAAC,EAAE,MAAM,CAAC,IAAI,IAAI,IAAI,CAAC,IAAI;KAC9C,CAAC;IAEF,IAAI,IAAI,CAAC,cAAc,EAAE,CAAC;QACtB,IAAI,CAAC;YACD,MAAM,KAAK,GAAG,MAAM,SAAS,CAAC,IAAI,CAAC,CAAC,IAAI,CACpC,IAAI,CAAC,6BAA6B,CAAC,CAAC,CAAC,eAAe,CAAC,CAAC,CAAC,YAAY,CACtE,CAAC;YACF,MAAM,CAAC,MAAM,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC;QAChC,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,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;AACjC,CAAC,CAAC;AAEN,MAAM,CAAC,KAAK,UAAU,SAAS,CAAC,OAAa;IACzC,OAAO,IAAI,OAAO,CAAmB,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;QACrD,MAAM,GAAG,GAAG,QAAQ,CAAC,aAAa,CAAC,KAAK,CAAC,CAAC;QAC1C,GAAG,CAAC,GAAG,GAAG,GAAG,CAAC,eAAe,CAAC,OAAO,CAAC,CAAC;QACvC,GAAG,CAAC,MAAM,GAAG,GAAG,EAAE;YACd,GAAG,CAAC,eAAe,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;YAC7B,OAAO,CAAC,GAAG,CAAC,CAAC;QACjB,CAAC,CAAC;QACF,GAAG,CAAC,OAAO,GAAG,CAAC,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,KAAK,EAAE,EAAE,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;IAC3D,CAAC,CAAC,CAAC;AACP,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,gBAAgB,CAAC,GAAW;IAC9C,OAAO,IAAI,OAAO,CAAmB,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;QACrD,MAAM,GAAG,GAAG,IAAI,KAAK,EAAE,CAAC;QACxB,GAAG,CAAC,MAAM,GAAG,GAAG,EAAE,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;QAChC,GAAG,CAAC,OAAO,GAAG,CAAC,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,KAAK,EAAE,EAAE,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;QACvD,GAAG,CAAC,GAAG,GAAG,GAAG,CAAC;IAClB,CAAC,CAAC,CAAC;AACP,CAAC;AAED,MAAM,UAAU,YAAY,CAAC,GAAqB;IAC9C,OAAO,EAAC,MAAM,EAAE,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,cAAc,EAAE,GAAG,CAAC,MAAM,CAAC,CAAC,EAAC,CAAC;AAClE,CAAC;AAED,MAAM,UAAU,eAAe,CAAC,EAAC,KAAK,EAAE,MAAM,EAAmB;IAI7D,MAAM,IAAI,GAAG,mBAAmB,CAAC;QAC7B,KAAK;QACL,MAAM;QACN,YAAY,EAAE,cAAc;KAC/B,CAAC,CAAC;IACH,OAAO,EAAC,KAAK,EAAE,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,MAAM,EAAE,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,EAAC,CAAC;AACpE,CAAC;AAED,MAAM,UAAU,QAAQ,CAAC,QAAiB;IACtC,OAAO,QAAQ,IAAI,CAAC,gBAAgB,CAAC,IAAI,CAAC,QAAQ,CAAC,IAAI,QAAQ,CAAC,UAAU,CAAC,gBAAgB,CAAC,CAAC,CAAC;AAClG,CAAC;AAED,MAAM,UAAU,aAAa,CAAC,GAAS,EAAE,EAAU;IAC/C,IAAI,MAAM,GAAqC,IAAI,CAAC;IAEpD,GAAG,CAAC,WAAW,CAAC,CAAC,IAAI,EAAE,GAAG,EAAE,EAAE;QAC1B,IAAI,WAAW,CAAC,IAAI,CAAC,IAAI,IAAI,CAAC,KAAK,CAAC,EAAE,KAAK,EAAE,EAAE,CAAC;YAC5C,MAAM,GAAG,EAAC,IAAI,EAAE,GAAG,EAAC,CAAC;YACrB,OAAO,KAAK,CAAC;QACjB,CAAC;QACD,OAAO,IAAI,CAAC;IAChB,CAAC,CAAC,CAAC;IAEH,OAAO,MAAM,CAAC;AAClB,CAAC","sourcesContent":["import type {Node, NodeType} from 'prosemirror-model';\n\nimport {type Logger2, globalLogger} from '../../../logger';\nimport {type UploadSuccessItem, getProportionalSize} from '../../../utils';\nimport {imageNodeName} from '../../markdown';\nimport {ImgSizeAttr} from '../../specs';\n\nimport {IMG_MAX_HEIGHT} from './const';\n\nexport function isImageNode(node: Node): boolean {\n return node.type.name === imageNodeName;\n}\n\nexport type CreateImageNodeOptions = {\n needDimensions: boolean;\n enableNewImageSizeCalculation?: boolean;\n};\n\nexport const createImageNode =\n (imgType: NodeType, opts: CreateImageNodeOptions, logger: Logger2.ILogger) =>\n async ({result, file}: UploadSuccessItem) => {\n const attrs: Record<string, string> = {\n [ImgSizeAttr.Src]: result.url,\n [ImgSizeAttr.Alt]: result.name ?? file.name,\n };\n\n if (opts.needDimensions) {\n try {\n const sizes = await loadImage(file).then(\n opts.enableNewImageSizeCalculation ? getImageSizeNew : getImageSize,\n );\n Object.assign(attrs, sizes);\n } catch (err) {\n globalLogger.error(err);\n logger.error({error: err});\n }\n }\n return imgType.create(attrs);\n };\n\nexport async function loadImage(imgFile: File) {\n return new Promise<HTMLImageElement>((resolve, reject) => {\n const img = document.createElement('img');\n img.src = URL.createObjectURL(imgFile);\n img.onload = () => {\n URL.revokeObjectURL(img.src);\n resolve(img);\n };\n img.onerror = (_e, _s, _l, _c, error) => reject(error);\n });\n}\n\nexport async function loadImageFromUrl(url: string): Promise<HTMLImageElement> {\n return new Promise<HTMLImageElement>((resolve, reject) => {\n const img = new Image();\n img.onload = () => resolve(img);\n img.onerror = (_e, _s, _l, _c, error) => reject(error);\n img.src = url;\n });\n}\n\nexport function getImageSize(img: HTMLImageElement): {[ImgSizeAttr.Height]?: string} {\n return {height: String(Math.min(IMG_MAX_HEIGHT, img.height))};\n}\n\nexport function getImageSizeNew({width, height}: HTMLImageElement): {\n [ImgSizeAttr.Width]?: string;\n [ImgSizeAttr.Height]?: string;\n} {\n const size = getProportionalSize({\n width,\n height,\n imgMaxHeight: IMG_MAX_HEIGHT,\n });\n return {width: String(size.width), height: String(size.height)};\n}\n\nexport function checkSvg(imageUrl?: string) {\n return imageUrl && (/\\.svg($|\\?|#)/i.test(imageUrl) || imageUrl.startsWith('data:image/svg'));\n}\n\nexport function findImageNode(doc: Node, id: string): {node: Node; pos: number} | null {\n let result: {node: Node; pos: number} | null = null;\n\n doc.descendants((node, pos) => {\n if (isImageNode(node) && node.attrs.id === id) {\n result = {node, pos};\n return false;\n }\n return true;\n });\n\n return result;\n}\n"]}
@@ -10,3 +10,8 @@ export declare enum CutAttr {
10
10
  export declare const cutType: (schema: import("prosemirror-model").Schema) => import("prosemirror-model").NodeType;
11
11
  export declare const cutTitleType: (schema: import("prosemirror-model").Schema) => import("prosemirror-model").NodeType;
12
12
  export declare const cutContentType: (schema: import("prosemirror-model").Schema) => import("prosemirror-model").NodeType;
13
+ export declare const YfmCutClassName: {
14
+ readonly Cut: "yfm-cut";
15
+ readonly Title: "yfm-cut-title";
16
+ readonly Content: "yfm-cut-content";
17
+ };
@@ -13,4 +13,9 @@ export var CutAttr;
13
13
  export const cutType = nodeTypeFactory(CutNode.Cut);
14
14
  export const cutTitleType = nodeTypeFactory(CutNode.CutTitle);
15
15
  export const cutContentType = nodeTypeFactory(CutNode.CutContent);
16
+ export const YfmCutClassName = {
17
+ Cut: 'yfm-cut',
18
+ Title: 'yfm-cut-title',
19
+ Content: 'yfm-cut-content',
20
+ };
16
21
  //# sourceMappingURL=const.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"const.js","sourceRoot":"../../../../../../src","sources":["extensions/yfm/YfmCut/YfmCutSpecs/const.ts"],"names":[],"mappings":"AAAA,OAAO,EAAC,eAAe,EAAC,oCAAiC;AAEzD,MAAM,CAAN,IAAY,OAIX;AAJD,WAAY,OAAO;IACf,0BAAe,CAAA;IACf,qCAA0B,CAAA;IAC1B,yCAA8B,CAAA;AAClC,CAAC,EAJW,OAAO,KAAP,OAAO,QAIlB;AAED,MAAM,CAAN,IAAY,OAGX;AAHD,WAAY,OAAO;IACf,0BAAe,CAAA;IACf,iCAAsB,CAAA;AAC1B,CAAC,EAHW,OAAO,KAAP,OAAO,QAGlB;AAED,MAAM,CAAC,MAAM,OAAO,GAAG,eAAe,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;AACpD,MAAM,CAAC,MAAM,YAAY,GAAG,eAAe,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC;AAC9D,MAAM,CAAC,MAAM,cAAc,GAAG,eAAe,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC","sourcesContent":["import {nodeTypeFactory} from '../../../../utils/schema';\n\nexport enum CutNode {\n Cut = 'yfm_cut',\n CutTitle = 'yfm_cut_title',\n CutContent = 'yfm_cut_content',\n}\n\nexport enum CutAttr {\n Class = 'class',\n Markup = 'data-markup',\n}\n\nexport const cutType = nodeTypeFactory(CutNode.Cut);\nexport const cutTitleType = nodeTypeFactory(CutNode.CutTitle);\nexport const cutContentType = nodeTypeFactory(CutNode.CutContent);\n"]}
1
+ {"version":3,"file":"const.js","sourceRoot":"../../../../../../src","sources":["extensions/yfm/YfmCut/YfmCutSpecs/const.ts"],"names":[],"mappings":"AAAA,OAAO,EAAC,eAAe,EAAC,oCAAyB;AAEjD,MAAM,CAAN,IAAY,OAIX;AAJD,WAAY,OAAO;IACf,0BAAe,CAAA;IACf,qCAA0B,CAAA;IAC1B,yCAA8B,CAAA;AAClC,CAAC,EAJW,OAAO,KAAP,OAAO,QAIlB;AAED,MAAM,CAAN,IAAY,OAGX;AAHD,WAAY,OAAO;IACf,0BAAe,CAAA;IACf,iCAAsB,CAAA;AAC1B,CAAC,EAHW,OAAO,KAAP,OAAO,QAGlB;AAED,MAAM,CAAC,MAAM,OAAO,GAAG,eAAe,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;AACpD,MAAM,CAAC,MAAM,YAAY,GAAG,eAAe,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC;AAC9D,MAAM,CAAC,MAAM,cAAc,GAAG,eAAe,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC;AAElE,MAAM,CAAC,MAAM,eAAe,GAAG;IAC3B,GAAG,EAAE,SAAS;IACd,KAAK,EAAE,eAAe;IACtB,OAAO,EAAE,iBAAiB;CACpB,CAAC","sourcesContent":["import {nodeTypeFactory} from 'src/utils/schema';\n\nexport enum CutNode {\n Cut = 'yfm_cut',\n CutTitle = 'yfm_cut_title',\n CutContent = 'yfm_cut_content',\n}\n\nexport enum CutAttr {\n Class = 'class',\n Markup = 'data-markup',\n}\n\nexport const cutType = nodeTypeFactory(CutNode.Cut);\nexport const cutTitleType = nodeTypeFactory(CutNode.CutTitle);\nexport const cutContentType = nodeTypeFactory(CutNode.CutContent);\n\nexport const YfmCutClassName = {\n Cut: 'yfm-cut',\n Title: 'yfm-cut-title',\n Content: 'yfm-cut-content',\n} as const;\n"]}
@@ -1,6 +1,6 @@
1
1
  import type { ExtensionAuto, ExtensionNodeSpec } from "../../../../core/index.js";
2
2
  import { type YfmCutSchemaOptions } from "./schema.js";
3
- export { CutAttr, CutNode, cutType, cutTitleType, cutContentType } from "./const.js";
3
+ export { CutAttr, CutNode, cutType, cutTitleType, cutContentType, YfmCutClassName } from "./const.js";
4
4
  declare global {
5
5
  namespace MarkdownEditor {
6
6
  interface DirectiveSyntaxAdditionalSupportedExtensions {
@@ -3,7 +3,7 @@ import { CutNode } from "./const.js";
3
3
  import { parserTokens } from "./parser.js";
4
4
  import { getSchemaSpecs } from "./schema.js";
5
5
  import { getSerializerTokens } from "./serializer.js";
6
- export { CutAttr, CutNode, cutType, cutTitleType, cutContentType } from "./const.js";
6
+ export { CutAttr, CutNode, cutType, cutTitleType, cutContentType, YfmCutClassName } from "./const.js";
7
7
  export const YfmCutSpecs = (builder, opts) => {
8
8
  const schemaSpecs = getSchemaSpecs(opts, builder.context.get('placeholder'));
9
9
  const directiveSyntax = builder.context.get('directiveSyntax');
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"../../../../../../src","sources":["extensions/yfm/YfmCut/YfmCutSpecs/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAC,SAAS,IAAI,MAAM,EAAC,MAAM,yBAAyB,CAAC;AAI5D,OAAO,EAAC,OAAO,EAAC,mBAAgB;AAChC,OAAO,EAAC,YAAY,EAAC,oBAAiB;AACtC,OAAO,EAA2B,cAAc,EAAC,oBAAiB;AAClE,OAAO,EAAC,mBAAmB,EAAC,wBAAqB;AAEjD,OAAO,EAAC,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,YAAY,EAAE,cAAc,EAAC,mBAAgB;AAiBhF,MAAM,CAAC,MAAM,WAAW,GAAsC,CAAC,OAAO,EAAE,IAAI,EAAE,EAAE;IAC5E,MAAM,WAAW,GAAG,cAAc,CAAC,IAAI,EAAE,OAAO,CAAC,OAAO,CAAC,GAAG,CAAC,aAAa,CAAC,CAAC,CAAC;IAC7E,MAAM,eAAe,GAAG,OAAO,CAAC,OAAO,CAAC,GAAG,CAAC,iBAAiB,CAAC,CAAC;IAC/D,MAAM,gBAAgB,GAAG,mBAAmB,CAAC,EAAC,eAAe,EAAC,CAAC,CAAC;IAEhE,OAAO;SACF,WAAW,CAAC,CAAC,EAAE,EAAE,EAAE,CAChB,EAAE,CAAC,GAAG,CACF,MAAM,CAAC;QACH,MAAM,EAAE,KAAK;QACb,eAAe,EAAE,eAAe,EAAE,gBAAgB,CAAC,QAAQ,CAAC;KAC/D,CAAC,CACL,CACJ;SACA,OAAO,CAAC,OAAO,CAAC,GAAG,EAAE,GAAG,EAAE,CAAC,CAAC;QACzB,IAAI,EAAE,WAAW,CAAC,OAAO,CAAC,GAAG,CAAC;QAC9B,IAAI,EAAE,gBAAgB,CAAC,OAAO,CAAC,GAAG,CAAC;QACnC,MAAM,EAAE;YACJ,SAAS,EAAE,YAAY,CAAC,OAAO,CAAC,GAAG,CAAC;SACvC;QACD,IAAI,EAAE,IAAI,CAAC,OAAO;KACrB,CAAC,CAAC;SACF,OAAO,CAAC,OAAO,CAAC,QAAQ,EAAE,GAAG,EAAE,CAAC,CAAC;QAC9B,IAAI,EAAE,WAAW,CAAC,OAAO,CAAC,QAAQ,CAAC;QACnC,IAAI,EAAE,gBAAgB,CAAC,OAAO,CAAC,QAAQ,CAAC;QACxC,MAAM,EAAE;YACJ,SAAS,EAAE,YAAY,CAAC,OAAO,CAAC,QAAQ,CAAC;SAC5C;QACD,IAAI,EAAE,IAAI,CAAC,YAAY;KAC1B,CAAC,CAAC;SACF,OAAO,CAAC,OAAO,CAAC,UAAU,EAAE,GAAG,EAAE,CAAC,CAAC;QAChC,IAAI,EAAE,WAAW,CAAC,OAAO,CAAC,UAAU,CAAC;QACrC,IAAI,EAAE,gBAAgB,CAAC,OAAO,CAAC,UAAU,CAAC;QAC1C,MAAM,EAAE;YACJ,SAAS,EAAE,YAAY,CAAC,OAAO,CAAC,UAAU,CAAC;SAC9C;QACD,IAAI,EAAE,IAAI,CAAC,cAAc;KAC5B,CAAC,CAAC,CAAC;AACZ,CAAC,CAAC","sourcesContent":["import {transform as yfmCut} from '@diplodoc/cut-extension';\n\nimport type {ExtensionAuto, ExtensionNodeSpec} from '../../../../core';\n\nimport {CutNode} from './const';\nimport {parserTokens} from './parser';\nimport {type YfmCutSchemaOptions, getSchemaSpecs} from './schema';\nimport {getSerializerTokens} from './serializer';\n\nexport {CutAttr, CutNode, cutType, cutTitleType, cutContentType} from './const';\n\ndeclare global {\n namespace MarkdownEditor {\n interface DirectiveSyntaxAdditionalSupportedExtensions {\n // Mark in global types that YfmCut has support for directive syntax\n yfmCut: true;\n }\n }\n}\n\nexport type YfmCutSpecsOptions = YfmCutSchemaOptions & {\n cutView?: ExtensionNodeSpec['view'];\n cutTitleView?: ExtensionNodeSpec['view'];\n cutContentView?: ExtensionNodeSpec['view'];\n};\n\nexport const YfmCutSpecs: ExtensionAuto<YfmCutSpecsOptions> = (builder, opts) => {\n const schemaSpecs = getSchemaSpecs(opts, builder.context.get('placeholder'));\n const directiveSyntax = builder.context.get('directiveSyntax');\n const serializerTokens = getSerializerTokens({directiveSyntax});\n\n builder\n .configureMd((md) =>\n md.use(\n yfmCut({\n bundle: false,\n directiveSyntax: directiveSyntax?.mdPluginValueFor('yfmCut'),\n }),\n ),\n )\n .addNode(CutNode.Cut, () => ({\n spec: schemaSpecs[CutNode.Cut],\n toMd: serializerTokens[CutNode.Cut],\n fromMd: {\n tokenSpec: parserTokens[CutNode.Cut],\n },\n view: opts.cutView,\n }))\n .addNode(CutNode.CutTitle, () => ({\n spec: schemaSpecs[CutNode.CutTitle],\n toMd: serializerTokens[CutNode.CutTitle],\n fromMd: {\n tokenSpec: parserTokens[CutNode.CutTitle],\n },\n view: opts.cutTitleView,\n }))\n .addNode(CutNode.CutContent, () => ({\n spec: schemaSpecs[CutNode.CutContent],\n toMd: serializerTokens[CutNode.CutContent],\n fromMd: {\n tokenSpec: parserTokens[CutNode.CutContent],\n },\n view: opts.cutContentView,\n }));\n};\n"]}
1
+ {"version":3,"file":"index.js","sourceRoot":"../../../../../../src","sources":["extensions/yfm/YfmCut/YfmCutSpecs/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAC,SAAS,IAAI,MAAM,EAAC,MAAM,yBAAyB,CAAC;AAI5D,OAAO,EAAC,OAAO,EAAC,mBAAgB;AAChC,OAAO,EAAC,YAAY,EAAC,oBAAiB;AACtC,OAAO,EAA2B,cAAc,EAAC,oBAAiB;AAClE,OAAO,EAAC,mBAAmB,EAAC,wBAAqB;AAEjD,OAAO,EAAC,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,YAAY,EAAE,cAAc,EAAE,eAAe,EAAC,mBAAgB;AAiBjG,MAAM,CAAC,MAAM,WAAW,GAAsC,CAAC,OAAO,EAAE,IAAI,EAAE,EAAE;IAC5E,MAAM,WAAW,GAAG,cAAc,CAAC,IAAI,EAAE,OAAO,CAAC,OAAO,CAAC,GAAG,CAAC,aAAa,CAAC,CAAC,CAAC;IAC7E,MAAM,eAAe,GAAG,OAAO,CAAC,OAAO,CAAC,GAAG,CAAC,iBAAiB,CAAC,CAAC;IAC/D,MAAM,gBAAgB,GAAG,mBAAmB,CAAC,EAAC,eAAe,EAAC,CAAC,CAAC;IAEhE,OAAO;SACF,WAAW,CAAC,CAAC,EAAE,EAAE,EAAE,CAChB,EAAE,CAAC,GAAG,CACF,MAAM,CAAC;QACH,MAAM,EAAE,KAAK;QACb,eAAe,EAAE,eAAe,EAAE,gBAAgB,CAAC,QAAQ,CAAC;KAC/D,CAAC,CACL,CACJ;SACA,OAAO,CAAC,OAAO,CAAC,GAAG,EAAE,GAAG,EAAE,CAAC,CAAC;QACzB,IAAI,EAAE,WAAW,CAAC,OAAO,CAAC,GAAG,CAAC;QAC9B,IAAI,EAAE,gBAAgB,CAAC,OAAO,CAAC,GAAG,CAAC;QACnC,MAAM,EAAE;YACJ,SAAS,EAAE,YAAY,CAAC,OAAO,CAAC,GAAG,CAAC;SACvC;QACD,IAAI,EAAE,IAAI,CAAC,OAAO;KACrB,CAAC,CAAC;SACF,OAAO,CAAC,OAAO,CAAC,QAAQ,EAAE,GAAG,EAAE,CAAC,CAAC;QAC9B,IAAI,EAAE,WAAW,CAAC,OAAO,CAAC,QAAQ,CAAC;QACnC,IAAI,EAAE,gBAAgB,CAAC,OAAO,CAAC,QAAQ,CAAC;QACxC,MAAM,EAAE;YACJ,SAAS,EAAE,YAAY,CAAC,OAAO,CAAC,QAAQ,CAAC;SAC5C;QACD,IAAI,EAAE,IAAI,CAAC,YAAY;KAC1B,CAAC,CAAC;SACF,OAAO,CAAC,OAAO,CAAC,UAAU,EAAE,GAAG,EAAE,CAAC,CAAC;QAChC,IAAI,EAAE,WAAW,CAAC,OAAO,CAAC,UAAU,CAAC;QACrC,IAAI,EAAE,gBAAgB,CAAC,OAAO,CAAC,UAAU,CAAC;QAC1C,MAAM,EAAE;YACJ,SAAS,EAAE,YAAY,CAAC,OAAO,CAAC,UAAU,CAAC;SAC9C;QACD,IAAI,EAAE,IAAI,CAAC,cAAc;KAC5B,CAAC,CAAC,CAAC;AACZ,CAAC,CAAC","sourcesContent":["import {transform as yfmCut} from '@diplodoc/cut-extension';\n\nimport type {ExtensionAuto, ExtensionNodeSpec} from '#core';\n\nimport {CutNode} from './const';\nimport {parserTokens} from './parser';\nimport {type YfmCutSchemaOptions, getSchemaSpecs} from './schema';\nimport {getSerializerTokens} from './serializer';\n\nexport {CutAttr, CutNode, cutType, cutTitleType, cutContentType, YfmCutClassName} from './const';\n\ndeclare global {\n namespace MarkdownEditor {\n interface DirectiveSyntaxAdditionalSupportedExtensions {\n // Mark in global types that YfmCut has support for directive syntax\n yfmCut: true;\n }\n }\n}\n\nexport type YfmCutSpecsOptions = YfmCutSchemaOptions & {\n cutView?: ExtensionNodeSpec['view'];\n cutTitleView?: ExtensionNodeSpec['view'];\n cutContentView?: ExtensionNodeSpec['view'];\n};\n\nexport const YfmCutSpecs: ExtensionAuto<YfmCutSpecsOptions> = (builder, opts) => {\n const schemaSpecs = getSchemaSpecs(opts, builder.context.get('placeholder'));\n const directiveSyntax = builder.context.get('directiveSyntax');\n const serializerTokens = getSerializerTokens({directiveSyntax});\n\n builder\n .configureMd((md) =>\n md.use(\n yfmCut({\n bundle: false,\n directiveSyntax: directiveSyntax?.mdPluginValueFor('yfmCut'),\n }),\n ),\n )\n .addNode(CutNode.Cut, () => ({\n spec: schemaSpecs[CutNode.Cut],\n toMd: serializerTokens[CutNode.Cut],\n fromMd: {\n tokenSpec: parserTokens[CutNode.Cut],\n },\n view: opts.cutView,\n }))\n .addNode(CutNode.CutTitle, () => ({\n spec: schemaSpecs[CutNode.CutTitle],\n toMd: serializerTokens[CutNode.CutTitle],\n fromMd: {\n tokenSpec: parserTokens[CutNode.CutTitle],\n },\n view: opts.cutTitleView,\n }))\n .addNode(CutNode.CutContent, () => ({\n spec: schemaSpecs[CutNode.CutContent],\n toMd: serializerTokens[CutNode.CutContent],\n fromMd: {\n tokenSpec: parserTokens[CutNode.CutContent],\n },\n view: opts.cutContentView,\n }));\n};\n"]}
@@ -1,4 +1,4 @@
1
- import type { NodeSpec } from 'prosemirror-model';
1
+ import type { NodeSpec } from "../../../../pm/model.js";
2
2
  import type { PlaceholderOptions } from "../../../../utils/placeholder.js";
3
3
  import { CutNode } from "./const.js";
4
4
  export type YfmCutSchemaOptions = {
@@ -1,16 +1,16 @@
1
- import { CutAttr, CutNode } from "./const.js";
1
+ import { CutAttr, CutNode, YfmCutClassName } from "./const.js";
2
2
  const DEFAULT_PLACEHOLDERS = {
3
3
  Title: 'Cut title',
4
4
  Content: 'Cut content',
5
5
  };
6
6
  export const getSchemaSpecs = (opts, placeholder) => ({
7
7
  [CutNode.Cut]: {
8
- attrs: { class: { default: 'yfm-cut' }, [CutAttr.Markup]: { default: null } },
8
+ attrs: { class: { default: YfmCutClassName.Cut }, [CutAttr.Markup]: { default: null } },
9
9
  content: `${CutNode.CutTitle} ${CutNode.CutContent}`,
10
10
  group: 'block yfm-cut',
11
11
  parseDOM: [
12
12
  {
13
- tag: '.yfm-cut',
13
+ tag: `.${YfmCutClassName.Cut}`,
14
14
  getAttrs: (node) => ({ [CutAttr.Markup]: node.getAttribute(CutAttr.Markup) }),
15
15
  },
16
16
  ],
@@ -23,10 +23,10 @@ export const getSchemaSpecs = (opts, placeholder) => ({
23
23
  complex: 'root',
24
24
  },
25
25
  [CutNode.CutTitle]: {
26
- attrs: { class: { default: 'yfm-cut-title' } },
26
+ attrs: { class: { default: YfmCutClassName.Title } },
27
27
  content: 'inline*',
28
28
  group: 'block yfm-cut',
29
- parseDOM: [{ tag: '.yfm-cut-title' }],
29
+ parseDOM: [{ tag: `.${YfmCutClassName.Title}` }],
30
30
  toDOM(node) {
31
31
  return ['div', node.attrs, 0];
32
32
  },
@@ -42,10 +42,10 @@ export const getSchemaSpecs = (opts, placeholder) => ({
42
42
  complex: 'leaf',
43
43
  },
44
44
  [CutNode.CutContent]: {
45
- attrs: { class: { default: 'yfm-cut-content' } },
45
+ attrs: { class: { default: YfmCutClassName.Content } },
46
46
  content: '(block | paragraph)+',
47
47
  group: 'block yfm-cut',
48
- parseDOM: [{ tag: '.yfm-cut-content' }],
48
+ parseDOM: [{ tag: `.${YfmCutClassName.Content}` }],
49
49
  toDOM(node) {
50
50
  return ['div', node.attrs, 0];
51
51
  },
@@ -1 +1 @@
1
- {"version":3,"file":"schema.js","sourceRoot":"../../../../../../src","sources":["extensions/yfm/YfmCut/YfmCutSpecs/schema.ts"],"names":[],"mappings":"AAIA,OAAO,EAAC,OAAO,EAAE,OAAO,EAAC,mBAAgB;AAazC,MAAM,oBAAoB,GAAG;IACzB,KAAK,EAAE,WAAW;IAClB,OAAO,EAAE,aAAa;CACzB,CAAC;AAEF,MAAM,CAAC,MAAM,cAAc,GAAG,CAC1B,IAA0B,EAC1B,WAAgC,EACP,EAAE,CAAC,CAAC;IAC7B,CAAC,OAAO,CAAC,GAAG,CAAC,EAAE;QACX,KAAK,EAAE,EAAC,KAAK,EAAE,EAAC,OAAO,EAAE,SAAS,EAAC,EAAE,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,EAAC,OAAO,EAAE,IAAI,EAAC,EAAC;QACvE,OAAO,EAAE,GAAG,OAAO,CAAC,QAAQ,IAAI,OAAO,CAAC,UAAU,EAAE;QACpD,KAAK,EAAE,eAAe;QACtB,QAAQ,EAAE;YACN;gBACI,GAAG,EAAE,UAAU;gBACf,QAAQ,EAAE,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,EAAC,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,IAAI,CAAC,YAAY,CAAC,OAAO,CAAC,MAAM,CAAC,EAAC,CAAC;aAC9E;SACJ;QACD,KAAK,CAAC,IAAI;YACN,OAAO,CAAC,KAAK,EAAE,IAAI,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC;QAClC,CAAC;QACD,UAAU,EAAE,IAAI;QAChB,cAAc,EAAE,IAAI;QACpB,QAAQ,EAAE,IAAI;QACd,OAAO,EAAE,MAAM;KAClB;IAED,CAAC,OAAO,CAAC,QAAQ,CAAC,EAAE;QAChB,KAAK,EAAE,EAAC,KAAK,EAAE,EAAC,OAAO,EAAE,eAAe,EAAC,EAAC;QAC1C,OAAO,EAAE,SAAS;QAClB,KAAK,EAAE,eAAe;QACtB,QAAQ,EAAE,CAAC,EAAC,GAAG,EAAE,gBAAgB,EAAC,CAAC;QACnC,KAAK,CAAC,IAAI;YACN,OAAO,CAAC,KAAK,EAAE,IAAI,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC;QAClC,CAAC;QACD,WAAW,EAAE;YACT,OAAO,EACH,WAAW,EAAE,CAAC,OAAO,CAAC,QAAQ,CAAC;gBAC/B,IAAI,EAAE,sBAAsB;gBAC5B,oBAAoB,CAAC,KAAK;YAC9B,aAAa,EAAE,IAAI;SACtB;QACD,iBAAiB,EAAE,IAAI;QACvB,UAAU,EAAE,KAAK;QACjB,cAAc,EAAE,KAAK;QACrB,OAAO,EAAE,MAAM;KAClB;IAED,CAAC,OAAO,CAAC,UAAU,CAAC,EAAE;QAClB,KAAK,EAAE,EAAC,KAAK,EAAE,EAAC,OAAO,EAAE,iBAAiB,EAAC,EAAC;QAC5C,OAAO,EAAE,sBAAsB;QAC/B,KAAK,EAAE,eAAe;QACtB,QAAQ,EAAE,CAAC,EAAC,GAAG,EAAE,kBAAkB,EAAC,CAAC;QACrC,KAAK,CAAC,IAAI;YACN,OAAO,CAAC,KAAK,EAAE,IAAI,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC;QAClC,CAAC;QACD,WAAW,EAAE;YACT,OAAO,EACH,WAAW,EAAE,CAAC,OAAO,CAAC,UAAU,CAAC;gBACjC,IAAI,EAAE,wBAAwB;gBAC9B,oBAAoB,CAAC,OAAO;YAChC,aAAa,EAAE,IAAI;SACtB;QACD,iBAAiB,EAAE,IAAI;QACvB,UAAU,EAAE,KAAK;QACjB,cAAc,EAAE,KAAK;QACrB,OAAO,EAAE,MAAM;KAClB;CACJ,CAAC,CAAC","sourcesContent":["import type {NodeSpec} from 'prosemirror-model';\n\nimport type {PlaceholderOptions} from '../../../../utils/placeholder';\n\nimport {CutAttr, CutNode} from './const';\n\nexport type YfmCutSchemaOptions = {\n /**\n * @deprecated: use placeholder option in BehaviorPreset instead.\n */\n yfmCutTitlePlaceholder?: NonNullable<NodeSpec['placeholder']>['content'];\n /**\n * @deprecated: use placeholder option in BehaviorPreset instead.\n */\n yfmCutContentPlaceholder?: NonNullable<NodeSpec['placeholder']>['content'];\n};\n\nconst DEFAULT_PLACEHOLDERS = {\n Title: 'Cut title',\n Content: 'Cut content',\n};\n\nexport const getSchemaSpecs = (\n opts?: YfmCutSchemaOptions,\n placeholder?: PlaceholderOptions,\n): Record<CutNode, NodeSpec> => ({\n [CutNode.Cut]: {\n attrs: {class: {default: 'yfm-cut'}, [CutAttr.Markup]: {default: null}},\n content: `${CutNode.CutTitle} ${CutNode.CutContent}`,\n group: 'block yfm-cut',\n parseDOM: [\n {\n tag: '.yfm-cut',\n getAttrs: (node) => ({[CutAttr.Markup]: node.getAttribute(CutAttr.Markup)}),\n },\n ],\n toDOM(node) {\n return ['div', node.attrs, 0];\n },\n selectable: true,\n allowSelection: true,\n defining: true,\n complex: 'root',\n },\n\n [CutNode.CutTitle]: {\n attrs: {class: {default: 'yfm-cut-title'}},\n content: 'inline*',\n group: 'block yfm-cut',\n parseDOM: [{tag: '.yfm-cut-title'}],\n toDOM(node) {\n return ['div', node.attrs, 0];\n },\n placeholder: {\n content:\n placeholder?.[CutNode.CutTitle] ??\n opts?.yfmCutTitlePlaceholder ??\n DEFAULT_PLACEHOLDERS.Title,\n alwaysVisible: true,\n },\n definingAsContext: true,\n selectable: false,\n allowSelection: false,\n complex: 'leaf',\n },\n\n [CutNode.CutContent]: {\n attrs: {class: {default: 'yfm-cut-content'}},\n content: '(block | paragraph)+',\n group: 'block yfm-cut',\n parseDOM: [{tag: '.yfm-cut-content'}],\n toDOM(node) {\n return ['div', node.attrs, 0];\n },\n placeholder: {\n content:\n placeholder?.[CutNode.CutContent] ??\n opts?.yfmCutContentPlaceholder ??\n DEFAULT_PLACEHOLDERS.Content,\n alwaysVisible: true,\n },\n definingAsContext: true,\n selectable: false,\n allowSelection: false,\n complex: 'leaf',\n },\n});\n"]}
1
+ {"version":3,"file":"schema.js","sourceRoot":"../../../../../../src","sources":["extensions/yfm/YfmCut/YfmCutSpecs/schema.ts"],"names":[],"mappings":"AAGA,OAAO,EAAC,OAAO,EAAE,OAAO,EAAE,eAAe,EAAC,mBAAgB;AAa1D,MAAM,oBAAoB,GAAG;IACzB,KAAK,EAAE,WAAW;IAClB,OAAO,EAAE,aAAa;CACzB,CAAC;AAEF,MAAM,CAAC,MAAM,cAAc,GAAG,CAC1B,IAA0B,EAC1B,WAAgC,EACP,EAAE,CAAC,CAAC;IAC7B,CAAC,OAAO,CAAC,GAAG,CAAC,EAAE;QACX,KAAK,EAAE,EAAC,KAAK,EAAE,EAAC,OAAO,EAAE,eAAe,CAAC,GAAG,EAAC,EAAE,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,EAAC,OAAO,EAAE,IAAI,EAAC,EAAC;QACjF,OAAO,EAAE,GAAG,OAAO,CAAC,QAAQ,IAAI,OAAO,CAAC,UAAU,EAAE;QACpD,KAAK,EAAE,eAAe;QACtB,QAAQ,EAAE;YACN;gBACI,GAAG,EAAE,IAAI,eAAe,CAAC,GAAG,EAAE;gBAC9B,QAAQ,EAAE,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,EAAC,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,IAAI,CAAC,YAAY,CAAC,OAAO,CAAC,MAAM,CAAC,EAAC,CAAC;aAC9E;SACJ;QACD,KAAK,CAAC,IAAI;YACN,OAAO,CAAC,KAAK,EAAE,IAAI,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC;QAClC,CAAC;QACD,UAAU,EAAE,IAAI;QAChB,cAAc,EAAE,IAAI;QACpB,QAAQ,EAAE,IAAI;QACd,OAAO,EAAE,MAAM;KAClB;IAED,CAAC,OAAO,CAAC,QAAQ,CAAC,EAAE;QAChB,KAAK,EAAE,EAAC,KAAK,EAAE,EAAC,OAAO,EAAE,eAAe,CAAC,KAAK,EAAC,EAAC;QAChD,OAAO,EAAE,SAAS;QAClB,KAAK,EAAE,eAAe;QACtB,QAAQ,EAAE,CAAC,EAAC,GAAG,EAAE,IAAI,eAAe,CAAC,KAAK,EAAE,EAAC,CAAC;QAC9C,KAAK,CAAC,IAAI;YACN,OAAO,CAAC,KAAK,EAAE,IAAI,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC;QAClC,CAAC;QACD,WAAW,EAAE;YACT,OAAO,EACH,WAAW,EAAE,CAAC,OAAO,CAAC,QAAQ,CAAC;gBAC/B,IAAI,EAAE,sBAAsB;gBAC5B,oBAAoB,CAAC,KAAK;YAC9B,aAAa,EAAE,IAAI;SACtB;QACD,iBAAiB,EAAE,IAAI;QACvB,UAAU,EAAE,KAAK;QACjB,cAAc,EAAE,KAAK;QACrB,OAAO,EAAE,MAAM;KAClB;IAED,CAAC,OAAO,CAAC,UAAU,CAAC,EAAE;QAClB,KAAK,EAAE,EAAC,KAAK,EAAE,EAAC,OAAO,EAAE,eAAe,CAAC,OAAO,EAAC,EAAC;QAClD,OAAO,EAAE,sBAAsB;QAC/B,KAAK,EAAE,eAAe;QACtB,QAAQ,EAAE,CAAC,EAAC,GAAG,EAAE,IAAI,eAAe,CAAC,OAAO,EAAE,EAAC,CAAC;QAChD,KAAK,CAAC,IAAI;YACN,OAAO,CAAC,KAAK,EAAE,IAAI,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC;QAClC,CAAC;QACD,WAAW,EAAE;YACT,OAAO,EACH,WAAW,EAAE,CAAC,OAAO,CAAC,UAAU,CAAC;gBACjC,IAAI,EAAE,wBAAwB;gBAC9B,oBAAoB,CAAC,OAAO;YAChC,aAAa,EAAE,IAAI;SACtB;QACD,iBAAiB,EAAE,IAAI;QACvB,UAAU,EAAE,KAAK;QACjB,cAAc,EAAE,KAAK;QACrB,OAAO,EAAE,MAAM;KAClB;CACJ,CAAC,CAAC","sourcesContent":["import type {NodeSpec} from '#pm/model';\nimport type {PlaceholderOptions} from 'src/utils/placeholder';\n\nimport {CutAttr, CutNode, YfmCutClassName} from './const';\n\nexport type YfmCutSchemaOptions = {\n /**\n * @deprecated: use placeholder option in BehaviorPreset instead.\n */\n yfmCutTitlePlaceholder?: NonNullable<NodeSpec['placeholder']>['content'];\n /**\n * @deprecated: use placeholder option in BehaviorPreset instead.\n */\n yfmCutContentPlaceholder?: NonNullable<NodeSpec['placeholder']>['content'];\n};\n\nconst DEFAULT_PLACEHOLDERS = {\n Title: 'Cut title',\n Content: 'Cut content',\n};\n\nexport const getSchemaSpecs = (\n opts?: YfmCutSchemaOptions,\n placeholder?: PlaceholderOptions,\n): Record<CutNode, NodeSpec> => ({\n [CutNode.Cut]: {\n attrs: {class: {default: YfmCutClassName.Cut}, [CutAttr.Markup]: {default: null}},\n content: `${CutNode.CutTitle} ${CutNode.CutContent}`,\n group: 'block yfm-cut',\n parseDOM: [\n {\n tag: `.${YfmCutClassName.Cut}`,\n getAttrs: (node) => ({[CutAttr.Markup]: node.getAttribute(CutAttr.Markup)}),\n },\n ],\n toDOM(node) {\n return ['div', node.attrs, 0];\n },\n selectable: true,\n allowSelection: true,\n defining: true,\n complex: 'root',\n },\n\n [CutNode.CutTitle]: {\n attrs: {class: {default: YfmCutClassName.Title}},\n content: 'inline*',\n group: 'block yfm-cut',\n parseDOM: [{tag: `.${YfmCutClassName.Title}`}],\n toDOM(node) {\n return ['div', node.attrs, 0];\n },\n placeholder: {\n content:\n placeholder?.[CutNode.CutTitle] ??\n opts?.yfmCutTitlePlaceholder ??\n DEFAULT_PLACEHOLDERS.Title,\n alwaysVisible: true,\n },\n definingAsContext: true,\n selectable: false,\n allowSelection: false,\n complex: 'leaf',\n },\n\n [CutNode.CutContent]: {\n attrs: {class: {default: YfmCutClassName.Content}},\n content: '(block | paragraph)+',\n group: 'block yfm-cut',\n parseDOM: [{tag: `.${YfmCutClassName.Content}`}],\n toDOM(node) {\n return ['div', node.attrs, 0];\n },\n placeholder: {\n content:\n placeholder?.[CutNode.CutContent] ??\n opts?.yfmCutContentPlaceholder ??\n DEFAULT_PLACEHOLDERS.Content,\n alwaysVisible: true,\n },\n definingAsContext: true,\n selectable: false,\n allowSelection: false,\n complex: 'leaf',\n },\n});\n"]}
@@ -1,4 +1,4 @@
1
- import { type Command } from 'prosemirror-state';
2
1
  import type { ActionSpec } from "../../../../core/index.js";
2
+ import { type Command } from "../../../../pm/state.js";
3
3
  export declare const createYfmCut: Command;
4
4
  export declare const toYfmCut: ActionSpec;
@@ -1,9 +1,9 @@
1
- import { TextSelection } from 'prosemirror-state';
2
- // @ts-ignore // TODO: fix cjs build
3
- import { findParentNodeClosestToPos } from 'prosemirror-utils';
4
- import { cutContentType, cutTitleType, cutType } from "../const.js";
1
+ import { TextSelection } from "../../../../pm/state.js";
2
+ import { findParentNodeClosestToPos } from "../../../../pm/utils.js";
3
+ import { YfmCutClassName, cutContentType, cutTitleType, cutType } from "../const.js";
5
4
  const createYfmCutNode = (schema) => (content) => {
6
- return cutType(schema).create({ class: 'yfm-cut open' }, [
5
+ const className = `${YfmCutClassName.Cut} ${YfmCutClassName.Open}`;
6
+ return cutType(schema).create({ class: className }, [
7
7
  cutTitleType(schema).create(null),
8
8
  cutContentType(schema).create(null, content),
9
9
  ]);
@@ -1 +1 @@
1
- {"version":3,"file":"toYfmCut.js","sourceRoot":"../../../../../../src","sources":["extensions/yfm/YfmCut/actions/toYfmCut.ts"],"names":[],"mappings":"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","sourcesContent":["import type {Fragment, Node, Schema} from 'prosemirror-model';\nimport {type Command, TextSelection} from 'prosemirror-state';\n// @ts-ignore // TODO: fix cjs build\nimport {findParentNodeClosestToPos} from 'prosemirror-utils';\n\nimport type {ActionSpec} from '../../../../core';\nimport {cutContentType, cutTitleType, cutType} from '../const';\n\nconst createYfmCutNode = (schema: Schema) => (content?: Node | Node[] | Fragment) => {\n return cutType(schema).create({class: 'yfm-cut open'}, [\n cutTitleType(schema).create(null),\n cutContentType(schema).create(null, content),\n ]);\n};\n\nexport const createYfmCut: Command = (state, dispatch) => {\n const {schema, selection: sel} = state;\n\n const textblock = findParentNodeClosestToPos(\n sel.$from,\n (node: Node) => node.isTextblock && !node.type.spec.complex,\n );\n\n if (!textblock) return false;\n\n if (dispatch) {\n const sliceFromPos = textblock.pos;\n let sliceToPos = sliceFromPos + textblock.node.nodeSize;\n\n const tbIndex = sel.$from.index(textblock.depth - 1);\n const tbParent = sel.$from.node(textblock.depth - 1);\n const tbParentStartPos = sel.$from.start(textblock.depth - 1);\n\n let flag = false;\n // find appropriate sliceToPos\n tbParent.forEach((node, offset, index) => {\n if (index < tbIndex || flag) return;\n if (node.type.spec.complex && node.type.spec.complex !== 'root') {\n flag = true;\n return;\n }\n\n const absoluteAfterPos = tbParentStartPos + offset + node.nodeSize;\n sliceToPos = absoluteAfterPos;\n\n if (sel.to < sliceToPos) flag = true;\n });\n\n const tr = state.tr;\n tr.replaceWith(\n sliceFromPos,\n sliceToPos,\n createYfmCutNode(schema)(tr.doc.slice(sliceFromPos, sliceToPos, false).content),\n );\n // set selection to start of cut title\n tr.setSelection(TextSelection.create(tr.doc, sliceFromPos + 2));\n dispatch(tr.scrollIntoView());\n }\n\n return true;\n};\n\nexport const toYfmCut: ActionSpec = {\n isEnable(state) {\n return createYfmCut(state);\n },\n run(state, dispatch) {\n createYfmCut(state, dispatch);\n },\n};\n"]}
1
+ {"version":3,"file":"toYfmCut.js","sourceRoot":"../../../../../../src","sources":["extensions/yfm/YfmCut/actions/toYfmCut.ts"],"names":[],"mappings":"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","sourcesContent":["import type {ActionSpec} from '#core';\nimport type {Fragment, Node, Schema} from '#pm/model';\nimport {type Command, TextSelection} from '#pm/state';\nimport {findParentNodeClosestToPos} from '#pm/utils';\n\nimport {YfmCutClassName, cutContentType, cutTitleType, cutType} from '../const';\n\nconst createYfmCutNode = (schema: Schema) => (content?: Node | Node[] | Fragment) => {\n const className = `${YfmCutClassName.Cut} ${YfmCutClassName.Open}` as const;\n return cutType(schema).create({class: className}, [\n cutTitleType(schema).create(null),\n cutContentType(schema).create(null, content),\n ]);\n};\n\nexport const createYfmCut: Command = (state, dispatch) => {\n const {schema, selection: sel} = state;\n\n const textblock = findParentNodeClosestToPos(\n sel.$from,\n (node: Node) => node.isTextblock && !node.type.spec.complex,\n );\n\n if (!textblock) return false;\n\n if (dispatch) {\n const sliceFromPos = textblock.pos;\n let sliceToPos = sliceFromPos + textblock.node.nodeSize;\n\n const tbIndex = sel.$from.index(textblock.depth - 1);\n const tbParent = sel.$from.node(textblock.depth - 1);\n const tbParentStartPos = sel.$from.start(textblock.depth - 1);\n\n let flag = false;\n // find appropriate sliceToPos\n tbParent.forEach((node, offset, index) => {\n if (index < tbIndex || flag) return;\n if (node.type.spec.complex && node.type.spec.complex !== 'root') {\n flag = true;\n return;\n }\n\n const absoluteAfterPos = tbParentStartPos + offset + node.nodeSize;\n sliceToPos = absoluteAfterPos;\n\n if (sel.to < sliceToPos) flag = true;\n });\n\n const tr = state.tr;\n tr.replaceWith(\n sliceFromPos,\n sliceToPos,\n createYfmCutNode(schema)(tr.doc.slice(sliceFromPos, sliceToPos, false).content),\n );\n // set selection to start of cut title\n tr.setSelection(TextSelection.create(tr.doc, sliceFromPos + 2));\n dispatch(tr.scrollIntoView());\n }\n\n return true;\n};\n\nexport const toYfmCut: ActionSpec = {\n isEnable(state) {\n return createYfmCut(state);\n },\n run(state, dispatch) {\n createYfmCut(state, dispatch);\n },\n};\n"]}
@@ -1 +1,9 @@
1
- export { CutNode, cutType, cutTitleType, cutContentType } from "./YfmCutSpecs/index.js";
1
+ export { CutNode, cutType, cutTitleType, cutContentType } from "./YfmCutSpecs/const.js";
2
+ export declare const YfmCutClassName: {
3
+ readonly TitleInner: "g-md-yfm-cut-title-inner";
4
+ readonly Open: "yfm-cut-open";
5
+ readonly Active: "yfm-cut-active";
6
+ readonly Cut: "yfm-cut";
7
+ readonly Title: "yfm-cut-title";
8
+ readonly Content: "yfm-cut-content";
9
+ };
@@ -1,2 +1,9 @@
1
- export { CutNode, cutType, cutTitleType, cutContentType } from "./YfmCutSpecs/index.js";
1
+ import { YfmCutClassName as YfmCutClassNameSpecs } from "./YfmCutSpecs/const.js";
2
+ export { CutNode, cutType, cutTitleType, cutContentType } from "./YfmCutSpecs/const.js";
3
+ export const YfmCutClassName = {
4
+ ...YfmCutClassNameSpecs,
5
+ TitleInner: 'g-md-yfm-cut-title-inner',
6
+ Open: 'yfm-cut-open',
7
+ Active: 'yfm-cut-active',
8
+ };
2
9
  //# sourceMappingURL=const.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"const.js","sourceRoot":"../../../../../src","sources":["extensions/yfm/YfmCut/const.ts"],"names":[],"mappings":"AAAA,OAAO,EAAC,OAAO,EAAE,OAAO,EAAE,YAAY,EAAE,cAAc,EAAC,+BAAsB","sourcesContent":["export {CutNode, cutType, cutTitleType, cutContentType} from './YfmCutSpecs';\n"]}
1
+ {"version":3,"file":"const.js","sourceRoot":"../../../../../src","sources":["extensions/yfm/YfmCut/const.ts"],"names":[],"mappings":"AAAA,OAAO,EAAC,eAAe,IAAI,oBAAoB,EAAC,+BAA4B;AAE5E,OAAO,EAAC,OAAO,EAAE,OAAO,EAAE,YAAY,EAAE,cAAc,EAAC,+BAA4B;AAEnF,MAAM,CAAC,MAAM,eAAe,GAAG;IAC3B,GAAG,oBAAoB;IACvB,UAAU,EAAE,0BAA0B;IACtC,IAAI,EAAE,cAAc;IACpB,MAAM,EAAE,gBAAgB;CAClB,CAAC","sourcesContent":["import {YfmCutClassName as YfmCutClassNameSpecs} from './YfmCutSpecs/const';\n\nexport {CutNode, cutType, cutTitleType, cutContentType} from './YfmCutSpecs/const';\n\nexport const YfmCutClassName = {\n ...YfmCutClassNameSpecs,\n TitleInner: 'g-md-yfm-cut-title-inner',\n Open: 'yfm-cut-open',\n Active: 'yfm-cut-active',\n} as const;\n"]}
@@ -10,7 +10,4 @@
10
10
  }
11
11
  .ProseMirror.yfm .yfm-cut .yfm-cut-title:focus {
12
12
  outline: 0;
13
- }
14
- .ProseMirror.yfm .yfm-cut.open > .yfm-cut-title:before {
15
- transform: translateY(-50%);
16
13
  }
@@ -1,13 +1,14 @@
1
- .yfm-cut-title .g-md-yfm-cut-title-inner {
1
+ .ProseMirror.yfm .yfm-cut-title > .g-md-yfm-cut-title-inner {
2
2
  cursor: text;
3
3
  }
4
-
5
- .yfm-cut-content {
4
+ .ProseMirror.yfm .yfm-cut-content {
6
5
  display: none;
7
6
  overflow: hidden;
8
7
  transition: height 0.3s ease-in-out;
9
8
  }
10
-
11
- .open > .yfm-cut-content {
9
+ .ProseMirror.yfm .yfm-cut.yfm-cut-open > .yfm-cut-title:before {
10
+ transform: translateY(-50%);
11
+ }
12
+ .ProseMirror.yfm .yfm-cut.yfm-cut-open > .yfm-cut-content {
12
13
  display: revert;
13
14
  }
@@ -1,5 +1,5 @@
1
- import type { Node } from 'prosemirror-model';
2
- import type { NodeView } from 'prosemirror-view';
1
+ import type { Node } from "../../../../pm/model.js";
2
+ import type { NodeView } from "../../../../pm/view.js";
3
3
  import "./yfm-cut-title.css";
4
4
  export declare class YfmCutTitleNodeView implements NodeView {
5
5
  readonly dom: HTMLElement;
@@ -7,4 +7,7 @@ export declare class YfmCutTitleNodeView implements NodeView {
7
7
  private node;
8
8
  constructor(node: Node);
9
9
  update(node: Node): boolean;
10
+ destroy(): void;
11
+ private _onTitleClick;
12
+ private _onTitleInnerClick;
10
13
  }
@@ -1,3 +1,4 @@
1
+ import { YfmCutClassName } from "../const.js";
1
2
  import "./yfm-cut-title.css";
2
3
  export class YfmCutTitleNodeView {
3
4
  dom;
@@ -6,15 +7,11 @@ export class YfmCutTitleNodeView {
6
7
  constructor(node) {
7
8
  this.node = node;
8
9
  this.dom = document.createElement('div');
9
- this.dom.classList.add('yfm-cut-title');
10
- this.dom.replaceChildren((this.contentDOM = document.createElement('div')));
11
- this.contentDOM.classList.add('g-md-yfm-cut-title-inner');
12
- this.contentDOM.addEventListener('click', (e) => {
13
- // ignore clicking on the title content
14
- // you can open/close yfm-cut by clicking on the arrow icon
15
- e.stopPropagation();
16
- e.preventDefault();
17
- });
10
+ this.dom.classList.add(YfmCutClassName.Title);
11
+ this.dom.addEventListener('click', this._onTitleClick);
12
+ this.contentDOM = this.dom.appendChild(document.createElement('div'));
13
+ this.contentDOM.classList.add(YfmCutClassName.TitleInner);
14
+ this.contentDOM.addEventListener('click', this._onTitleInnerClick);
18
15
  }
19
16
  update(node) {
20
17
  if (this.node.type !== node.type)
@@ -22,5 +19,25 @@ export class YfmCutTitleNodeView {
22
19
  this.node = node;
23
20
  return true;
24
21
  }
22
+ destroy() {
23
+ this.dom.removeEventListener('click', this._onTitleClick);
24
+ this.contentDOM.removeEventListener('click', this._onTitleInnerClick);
25
+ }
26
+ _onTitleClick = (e) => {
27
+ const { currentTarget } = e;
28
+ if (currentTarget instanceof HTMLElement) {
29
+ const parent = currentTarget.parentElement;
30
+ if (parent?.classList.contains(YfmCutClassName.Cut)) {
31
+ // TODO: toggle open classname via prosemirror decoration
32
+ parent.classList.toggle(YfmCutClassName.Open);
33
+ }
34
+ }
35
+ };
36
+ _onTitleInnerClick = (e) => {
37
+ // ignore clicking on the title content
38
+ // you can open/close yfm-cut by clicking on the arrow icon
39
+ e.stopPropagation();
40
+ e.preventDefault();
41
+ };
25
42
  }
26
43
  //# sourceMappingURL=yfm-cut-title.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"yfm-cut-title.js","sourceRoot":"../../../../../../src","sources":["extensions/yfm/YfmCut/nodeviews/yfm-cut-title.ts"],"names":[],"mappings":"AAGA,6BAA8B;AAE9B,MAAM,OAAO,mBAAmB;IACnB,GAAG,CAAc;IACjB,UAAU,CAAc;IAEzB,IAAI,CAAO;IAEnB,YAAY,IAAU;QAClB,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC;QAEjB,IAAI,CAAC,GAAG,GAAG,QAAQ,CAAC,aAAa,CAAC,KAAK,CAAC,CAAC;QACzC,IAAI,CAAC,GAAG,CAAC,SAAS,CAAC,GAAG,CAAC,eAAe,CAAC,CAAC;QACxC,IAAI,CAAC,GAAG,CAAC,eAAe,CAAC,CAAC,IAAI,CAAC,UAAU,GAAG,QAAQ,CAAC,aAAa,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;QAC5E,IAAI,CAAC,UAAU,CAAC,SAAS,CAAC,GAAG,CAAC,0BAA0B,CAAC,CAAC;QAC1D,IAAI,CAAC,UAAU,CAAC,gBAAgB,CAAC,OAAO,EAAE,CAAC,CAAC,EAAE,EAAE;YAC5C,uCAAuC;YACvC,2DAA2D;YAC3D,CAAC,CAAC,eAAe,EAAE,CAAC;YACpB,CAAC,CAAC,cAAc,EAAE,CAAC;QACvB,CAAC,CAAC,CAAC;IACP,CAAC;IAED,MAAM,CAAC,IAAU;QACb,IAAI,IAAI,CAAC,IAAI,CAAC,IAAI,KAAK,IAAI,CAAC,IAAI;YAAE,OAAO,KAAK,CAAC;QAC/C,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC;QACjB,OAAO,IAAI,CAAC;IAChB,CAAC;CACJ","sourcesContent":["import type {Node} from 'prosemirror-model';\nimport type {NodeView} from 'prosemirror-view';\n\nimport './yfm-cut-title.scss';\n\nexport class YfmCutTitleNodeView implements NodeView {\n readonly dom: HTMLElement;\n readonly contentDOM: HTMLElement;\n\n private node: Node;\n\n constructor(node: Node) {\n this.node = node;\n\n this.dom = document.createElement('div');\n this.dom.classList.add('yfm-cut-title');\n this.dom.replaceChildren((this.contentDOM = document.createElement('div')));\n this.contentDOM.classList.add('g-md-yfm-cut-title-inner');\n this.contentDOM.addEventListener('click', (e) => {\n // ignore clicking on the title content\n // you can open/close yfm-cut by clicking on the arrow icon\n e.stopPropagation();\n e.preventDefault();\n });\n }\n\n update(node: Node): boolean {\n if (this.node.type !== node.type) return false;\n this.node = node;\n return true;\n }\n}\n"]}
1
+ {"version":3,"file":"yfm-cut-title.js","sourceRoot":"../../../../../../src","sources":["extensions/yfm/YfmCut/nodeviews/yfm-cut-title.ts"],"names":[],"mappings":"AAGA,OAAO,EAAC,eAAe,EAAC,oBAAiB;AAEzC,6BAA8B;AAE9B,MAAM,OAAO,mBAAmB;IACnB,GAAG,CAAc;IACjB,UAAU,CAAc;IAEzB,IAAI,CAAO;IAEnB,YAAY,IAAU;QAClB,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC;QAEjB,IAAI,CAAC,GAAG,GAAG,QAAQ,CAAC,aAAa,CAAC,KAAK,CAAC,CAAC;QACzC,IAAI,CAAC,GAAG,CAAC,SAAS,CAAC,GAAG,CAAC,eAAe,CAAC,KAAK,CAAC,CAAC;QAC9C,IAAI,CAAC,GAAG,CAAC,gBAAgB,CAAC,OAAO,EAAE,IAAI,CAAC,aAAa,CAAC,CAAC;QAEvD,IAAI,CAAC,UAAU,GAAG,IAAI,CAAC,GAAG,CAAC,WAAW,CAAC,QAAQ,CAAC,aAAa,CAAC,KAAK,CAAC,CAAC,CAAC;QACtE,IAAI,CAAC,UAAU,CAAC,SAAS,CAAC,GAAG,CAAC,eAAe,CAAC,UAAU,CAAC,CAAC;QAC1D,IAAI,CAAC,UAAU,CAAC,gBAAgB,CAAC,OAAO,EAAE,IAAI,CAAC,kBAAkB,CAAC,CAAC;IACvE,CAAC;IAED,MAAM,CAAC,IAAU;QACb,IAAI,IAAI,CAAC,IAAI,CAAC,IAAI,KAAK,IAAI,CAAC,IAAI;YAAE,OAAO,KAAK,CAAC;QAC/C,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC;QACjB,OAAO,IAAI,CAAC;IAChB,CAAC;IAED,OAAO;QACH,IAAI,CAAC,GAAG,CAAC,mBAAmB,CAAC,OAAO,EAAE,IAAI,CAAC,aAAa,CAAC,CAAC;QAC1D,IAAI,CAAC,UAAU,CAAC,mBAAmB,CAAC,OAAO,EAAE,IAAI,CAAC,kBAAkB,CAAC,CAAC;IAC1E,CAAC;IAEO,aAAa,GAAG,CAAC,CAAa,EAAE,EAAE;QACtC,MAAM,EAAC,aAAa,EAAC,GAAG,CAAC,CAAC;QAC1B,IAAI,aAAa,YAAY,WAAW,EAAE,CAAC;YACvC,MAAM,MAAM,GAAG,aAAa,CAAC,aAAa,CAAC;YAC3C,IAAI,MAAM,EAAE,SAAS,CAAC,QAAQ,CAAC,eAAe,CAAC,GAAG,CAAC,EAAE,CAAC;gBAClD,yDAAyD;gBACzD,MAAM,CAAC,SAAS,CAAC,MAAM,CAAC,eAAe,CAAC,IAAI,CAAC,CAAC;YAClD,CAAC;QACL,CAAC;IACL,CAAC,CAAC;IAEM,kBAAkB,GAAG,CAAC,CAAa,EAAE,EAAE;QAC3C,uCAAuC;QACvC,2DAA2D;QAC3D,CAAC,CAAC,eAAe,EAAE,CAAC;QACpB,CAAC,CAAC,cAAc,EAAE,CAAC;IACvB,CAAC,CAAC;CACL","sourcesContent":["import type {Node} from '#pm/model';\nimport type {NodeView} from '#pm/view';\n\nimport {YfmCutClassName} from '../const';\n\nimport './yfm-cut-title.scss';\n\nexport class YfmCutTitleNodeView implements NodeView {\n readonly dom: HTMLElement;\n readonly contentDOM: HTMLElement;\n\n private node: Node;\n\n constructor(node: Node) {\n this.node = node;\n\n this.dom = document.createElement('div');\n this.dom.classList.add(YfmCutClassName.Title);\n this.dom.addEventListener('click', this._onTitleClick);\n\n this.contentDOM = this.dom.appendChild(document.createElement('div'));\n this.contentDOM.classList.add(YfmCutClassName.TitleInner);\n this.contentDOM.addEventListener('click', this._onTitleInnerClick);\n }\n\n update(node: Node): boolean {\n if (this.node.type !== node.type) return false;\n this.node = node;\n return true;\n }\n\n destroy() {\n this.dom.removeEventListener('click', this._onTitleClick);\n this.contentDOM.removeEventListener('click', this._onTitleInnerClick);\n }\n\n private _onTitleClick = (e: MouseEvent) => {\n const {currentTarget} = e;\n if (currentTarget instanceof HTMLElement) {\n const parent = currentTarget.parentElement;\n if (parent?.classList.contains(YfmCutClassName.Cut)) {\n // TODO: toggle open classname via prosemirror decoration\n parent.classList.toggle(YfmCutClassName.Open);\n }\n }\n };\n\n private _onTitleInnerClick = (e: MouseEvent) => {\n // ignore clicking on the title content\n // you can open/close yfm-cut by clicking on the arrow icon\n e.stopPropagation();\n e.preventDefault();\n };\n}\n"]}