@gravity-ui/markdown-editor 15.27.2 → 15.29.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 (211) hide show
  1. package/README.md +6 -4
  2. package/build/cjs/bundle/Editor.js +1 -0
  3. package/build/cjs/bundle/Editor.js.map +1 -1
  4. package/build/cjs/bundle/HorizontalDrag.js +3 -3
  5. package/build/cjs/bundle/HorizontalDrag.js.map +1 -1
  6. package/build/cjs/bundle/settings/index.css +6 -14
  7. package/build/cjs/bundle/settings/index.js +5 -2
  8. package/build/cjs/bundle/settings/index.js.map +1 -1
  9. package/build/cjs/bundle/toolbar/utils/toolbarsConfigs.js +8 -8
  10. package/build/cjs/bundle/toolbar/utils/toolbarsConfigs.js.map +1 -1
  11. package/build/cjs/bundle/types.d.ts +10 -11
  12. package/build/cjs/bundle/types.js.map +1 -1
  13. package/build/cjs/bundle/wysiwyg-preset.d.ts +0 -1
  14. package/build/cjs/bundle/wysiwyg-preset.js +1 -1
  15. package/build/cjs/bundle/wysiwyg-preset.js.map +1 -1
  16. package/build/cjs/core/Editor.js.map +1 -1
  17. package/build/cjs/core/ExtensionBuilder.d.ts +0 -2
  18. package/build/cjs/core/ExtensionBuilder.js +1 -1
  19. package/build/cjs/core/ExtensionBuilder.js.map +1 -1
  20. package/build/cjs/core/markdown/MarkdownParser.d.ts +2 -3
  21. package/build/cjs/core/markdown/MarkdownParser.js.map +1 -1
  22. package/build/cjs/core/types/extension.js.map +1 -1
  23. package/build/cjs/core/types/parser.d.ts +3 -2
  24. package/build/cjs/core/types/parser.js.map +1 -1
  25. package/build/cjs/extensions/additional/GPT/gptExtension/view.js +1 -3
  26. package/build/cjs/extensions/additional/GPT/gptExtension/view.js.map +1 -1
  27. package/build/cjs/extensions/additional/Mermaid/MermaidSpecs/index.js +0 -1
  28. package/build/cjs/extensions/additional/Mermaid/MermaidSpecs/index.js.map +1 -1
  29. package/build/cjs/extensions/additional/YfmHtmlBlock/YfmHtmlBlockNodeView/YfmHtmlBlockView.js +1 -1
  30. package/build/cjs/extensions/additional/YfmHtmlBlock/YfmHtmlBlockNodeView/YfmHtmlBlockView.js.map +1 -1
  31. package/build/cjs/extensions/additional/YfmHtmlBlock/YfmHtmlBlockSpecs/index.js.map +1 -1
  32. package/build/cjs/extensions/additional/YfmHtmlBlock/index.js.map +1 -1
  33. package/build/cjs/extensions/behavior/Autocomplete/types.js.map +1 -1
  34. package/build/cjs/extensions/behavior/SelectionContext/index.d.ts +0 -2
  35. package/build/cjs/extensions/behavior/SelectionContext/index.js.map +1 -1
  36. package/build/cjs/extensions/behavior/SelectionContext/tooltip.js.map +1 -1
  37. package/build/cjs/extensions/markdown/CodeBlock/CodeBlockHighlight/CodeBlockHighlight.js +3 -1
  38. package/build/cjs/extensions/markdown/CodeBlock/CodeBlockHighlight/CodeBlockHighlight.js.map +1 -1
  39. package/build/cjs/extensions/markdown/CodeBlock/handle-paste.d.ts +20 -0
  40. package/build/cjs/extensions/markdown/CodeBlock/handle-paste.js +80 -23
  41. package/build/cjs/extensions/markdown/CodeBlock/handle-paste.js.map +1 -1
  42. package/build/cjs/extensions/markdown/Deflist/DeflistSpecs/index.d.ts +2 -2
  43. package/build/cjs/extensions/markdown/Deflist/DeflistSpecs/index.js.map +1 -1
  44. package/build/cjs/extensions/markdown/Heading/HeadingSpecs/index.d.ts +1 -1
  45. package/build/cjs/extensions/markdown/Heading/HeadingSpecs/index.js.map +1 -1
  46. package/build/cjs/extensions/yfm/Checkbox/CheckboxSpecs/index.d.ts +1 -1
  47. package/build/cjs/extensions/yfm/Checkbox/CheckboxSpecs/index.js.map +1 -1
  48. package/build/cjs/extensions/yfm/ImgSize/ImgSizeSpecs/index.d.ts +1 -1
  49. package/build/cjs/extensions/yfm/ImgSize/ImgSizeSpecs/index.js.map +1 -1
  50. package/build/cjs/extensions/yfm/ImgSize/index.d.ts +0 -1
  51. package/build/cjs/extensions/yfm/ImgSize/index.js.map +1 -1
  52. package/build/cjs/extensions/yfm/Video/VideoSpecs/md-video.d.ts +1 -1
  53. package/build/cjs/extensions/yfm/YfmCut/YfmCutSpecs/schema.d.ts +2 -2
  54. package/build/cjs/extensions/yfm/YfmCut/YfmCutSpecs/schema.js.map +1 -1
  55. package/build/cjs/extensions/yfm/YfmNote/YfmNoteSpecs/index.d.ts +1 -1
  56. package/build/cjs/extensions/yfm/YfmNote/YfmNoteSpecs/index.js.map +1 -1
  57. package/build/cjs/extensions/yfm/YfmTable/index.d.ts +0 -2
  58. package/build/cjs/extensions/yfm/YfmTable/index.js.map +1 -1
  59. package/build/cjs/extensions/yfm/YfmTable/plugins/YfmTableControls/components/FloatingMenuControl/FloatingMenuControl.js.map +1 -1
  60. package/build/cjs/extensions/yfm/YfmTable/plugins/YfmTableControls/components/FloatingPlusButton/InsertCursor.d.ts +1 -1
  61. package/build/cjs/extensions/yfm/YfmTable/plugins/YfmTableControls/components/FloatingPlusButton/InsertCursor.js +3 -4
  62. package/build/cjs/extensions/yfm/YfmTable/plugins/YfmTableControls/components/FloatingPlusButton/InsertCursor.js.map +1 -1
  63. package/build/cjs/extensions/yfm/YfmTable/plugins/YfmTableControls/components/FloatingPlusControl/FloatingPlusControl.js.map +1 -1
  64. package/build/cjs/extensions/yfm/YfmTable/plugins/YfmTableControls/components/FloatingPopup/FloatingPopup.js +0 -1
  65. package/build/cjs/extensions/yfm/YfmTable/plugins/YfmTableControls/components/FloatingPopup/FloatingPopup.js.map +1 -1
  66. package/build/cjs/extensions/yfm/YfmTabs/YfmTabsSpecs/schema.d.ts +1 -1
  67. package/build/cjs/extensions/yfm/YfmTabs/YfmTabsSpecs/schema.js.map +1 -1
  68. package/build/cjs/i18n/bundle/en.json +2 -1
  69. package/build/cjs/i18n/bundle/index.d.ts +3 -2
  70. package/build/cjs/i18n/bundle/ru.json +2 -1
  71. package/build/cjs/i18n/common/en.json +2 -1
  72. package/build/cjs/i18n/common/index.d.ts +2 -1
  73. package/build/cjs/i18n/common/ru.json +2 -1
  74. package/build/cjs/logger.d.ts +0 -1
  75. package/build/cjs/logger.js +0 -1
  76. package/build/cjs/logger.js.map +1 -1
  77. package/build/cjs/markup/codemirror/create.d.ts +3 -1
  78. package/build/cjs/markup/codemirror/create.js +4 -1
  79. package/build/cjs/markup/codemirror/create.js.map +1 -1
  80. package/build/cjs/markup/codemirror/gravity.js +0 -1
  81. package/build/cjs/markup/codemirror/gravity.js.map +1 -1
  82. package/build/cjs/shortcuts/default.js +0 -2
  83. package/build/cjs/shortcuts/default.js.map +1 -1
  84. package/build/cjs/table-utils/commands/removeRow.js +1 -2
  85. package/build/cjs/table-utils/commands/removeRow.js.map +1 -1
  86. package/build/cjs/toolbar/types.d.ts +2 -3
  87. package/build/cjs/toolbar/types.js.map +1 -1
  88. package/build/cjs/types/spec.d.ts +0 -1
  89. package/build/cjs/types/spec.js.map +1 -1
  90. package/build/cjs/utils/ecapeRegexp.d.ts +1 -2
  91. package/build/cjs/utils/ecapeRegexp.js +1 -2
  92. package/build/cjs/utils/ecapeRegexp.js.map +1 -1
  93. package/build/cjs/utils/inputrules.js +2 -2
  94. package/build/cjs/utils/inputrules.js.map +1 -1
  95. package/build/cjs/version.js +1 -1
  96. package/build/cjs/version.js.map +1 -1
  97. package/build/cjs/view/hooks/useFilesGallery/constants.d.ts +5 -0
  98. package/build/cjs/view/hooks/useFilesGallery/constants.js +10 -2
  99. package/build/cjs/view/hooks/useFilesGallery/constants.js.map +1 -1
  100. package/build/cjs/view/hooks/useFilesGallery/helpers.d.ts +8 -0
  101. package/build/cjs/view/hooks/useFilesGallery/helpers.js +28 -0
  102. package/build/cjs/view/hooks/useFilesGallery/helpers.js.map +1 -0
  103. package/build/cjs/view/hooks/useFilesGallery/useFilesGallery.d.ts +0 -1
  104. package/build/cjs/view/hooks/useFilesGallery/useFilesGallery.js +19 -22
  105. package/build/cjs/view/hooks/useFilesGallery/useFilesGallery.js.map +1 -1
  106. package/build/esm/bundle/Editor.js +1 -0
  107. package/build/esm/bundle/Editor.js.map +1 -1
  108. package/build/esm/bundle/HorizontalDrag.js +3 -3
  109. package/build/esm/bundle/HorizontalDrag.js.map +1 -1
  110. package/build/esm/bundle/settings/index.css +6 -14
  111. package/build/esm/bundle/settings/index.js +6 -3
  112. package/build/esm/bundle/settings/index.js.map +1 -1
  113. package/build/esm/bundle/toolbar/utils/toolbarsConfigs.js +8 -8
  114. package/build/esm/bundle/toolbar/utils/toolbarsConfigs.js.map +1 -1
  115. package/build/esm/bundle/types.d.ts +10 -11
  116. package/build/esm/bundle/types.js.map +1 -1
  117. package/build/esm/bundle/wysiwyg-preset.d.ts +0 -1
  118. package/build/esm/bundle/wysiwyg-preset.js +1 -1
  119. package/build/esm/bundle/wysiwyg-preset.js.map +1 -1
  120. package/build/esm/core/Editor.js.map +1 -1
  121. package/build/esm/core/ExtensionBuilder.d.ts +0 -2
  122. package/build/esm/core/ExtensionBuilder.js +1 -1
  123. package/build/esm/core/ExtensionBuilder.js.map +1 -1
  124. package/build/esm/core/markdown/MarkdownParser.d.ts +2 -3
  125. package/build/esm/core/markdown/MarkdownParser.js.map +1 -1
  126. package/build/esm/core/types/extension.js.map +1 -1
  127. package/build/esm/core/types/parser.d.ts +3 -2
  128. package/build/esm/core/types/parser.js.map +1 -1
  129. package/build/esm/extensions/additional/GPT/gptExtension/view.js +1 -3
  130. package/build/esm/extensions/additional/GPT/gptExtension/view.js.map +1 -1
  131. package/build/esm/extensions/additional/Mermaid/MermaidSpecs/index.js +0 -1
  132. package/build/esm/extensions/additional/Mermaid/MermaidSpecs/index.js.map +1 -1
  133. package/build/esm/extensions/additional/YfmHtmlBlock/YfmHtmlBlockNodeView/YfmHtmlBlockView.js +1 -1
  134. package/build/esm/extensions/additional/YfmHtmlBlock/YfmHtmlBlockNodeView/YfmHtmlBlockView.js.map +1 -1
  135. package/build/esm/extensions/additional/YfmHtmlBlock/YfmHtmlBlockSpecs/index.js.map +1 -1
  136. package/build/esm/extensions/additional/YfmHtmlBlock/index.js.map +1 -1
  137. package/build/esm/extensions/behavior/Autocomplete/types.js.map +1 -1
  138. package/build/esm/extensions/behavior/SelectionContext/index.d.ts +0 -2
  139. package/build/esm/extensions/behavior/SelectionContext/index.js.map +1 -1
  140. package/build/esm/extensions/behavior/SelectionContext/tooltip.js.map +1 -1
  141. package/build/esm/extensions/markdown/CodeBlock/CodeBlockHighlight/CodeBlockHighlight.js +3 -1
  142. package/build/esm/extensions/markdown/CodeBlock/CodeBlockHighlight/CodeBlockHighlight.js.map +1 -1
  143. package/build/esm/extensions/markdown/CodeBlock/handle-paste.d.ts +20 -0
  144. package/build/esm/extensions/markdown/CodeBlock/handle-paste.js +78 -24
  145. package/build/esm/extensions/markdown/CodeBlock/handle-paste.js.map +1 -1
  146. package/build/esm/extensions/markdown/Deflist/DeflistSpecs/index.d.ts +2 -2
  147. package/build/esm/extensions/markdown/Deflist/DeflistSpecs/index.js.map +1 -1
  148. package/build/esm/extensions/markdown/Heading/HeadingSpecs/index.d.ts +1 -1
  149. package/build/esm/extensions/markdown/Heading/HeadingSpecs/index.js.map +1 -1
  150. package/build/esm/extensions/yfm/Checkbox/CheckboxSpecs/index.d.ts +1 -1
  151. package/build/esm/extensions/yfm/Checkbox/CheckboxSpecs/index.js.map +1 -1
  152. package/build/esm/extensions/yfm/ImgSize/ImgSizeSpecs/index.d.ts +1 -1
  153. package/build/esm/extensions/yfm/ImgSize/ImgSizeSpecs/index.js.map +1 -1
  154. package/build/esm/extensions/yfm/ImgSize/index.d.ts +0 -1
  155. package/build/esm/extensions/yfm/ImgSize/index.js.map +1 -1
  156. package/build/esm/extensions/yfm/Video/VideoSpecs/md-video.d.ts +1 -1
  157. package/build/esm/extensions/yfm/YfmCut/YfmCutSpecs/schema.d.ts +2 -2
  158. package/build/esm/extensions/yfm/YfmCut/YfmCutSpecs/schema.js.map +1 -1
  159. package/build/esm/extensions/yfm/YfmNote/YfmNoteSpecs/index.d.ts +1 -1
  160. package/build/esm/extensions/yfm/YfmNote/YfmNoteSpecs/index.js.map +1 -1
  161. package/build/esm/extensions/yfm/YfmTable/index.d.ts +0 -2
  162. package/build/esm/extensions/yfm/YfmTable/index.js.map +1 -1
  163. package/build/esm/extensions/yfm/YfmTable/plugins/YfmTableControls/components/FloatingMenuControl/FloatingMenuControl.js.map +1 -1
  164. package/build/esm/extensions/yfm/YfmTable/plugins/YfmTableControls/components/FloatingPlusButton/InsertCursor.d.ts +1 -1
  165. package/build/esm/extensions/yfm/YfmTable/plugins/YfmTableControls/components/FloatingPlusButton/InsertCursor.js +1 -2
  166. package/build/esm/extensions/yfm/YfmTable/plugins/YfmTableControls/components/FloatingPlusButton/InsertCursor.js.map +1 -1
  167. package/build/esm/extensions/yfm/YfmTable/plugins/YfmTableControls/components/FloatingPlusControl/FloatingPlusControl.js.map +1 -1
  168. package/build/esm/extensions/yfm/YfmTable/plugins/YfmTableControls/components/FloatingPopup/FloatingPopup.js +0 -1
  169. package/build/esm/extensions/yfm/YfmTable/plugins/YfmTableControls/components/FloatingPopup/FloatingPopup.js.map +1 -1
  170. package/build/esm/extensions/yfm/YfmTabs/YfmTabsSpecs/schema.d.ts +1 -1
  171. package/build/esm/extensions/yfm/YfmTabs/YfmTabsSpecs/schema.js.map +1 -1
  172. package/build/esm/i18n/bundle/en.json +2 -1
  173. package/build/esm/i18n/bundle/index.d.ts +3 -2
  174. package/build/esm/i18n/bundle/ru.json +2 -1
  175. package/build/esm/i18n/common/en.json +2 -1
  176. package/build/esm/i18n/common/index.d.ts +2 -1
  177. package/build/esm/i18n/common/ru.json +2 -1
  178. package/build/esm/logger.d.ts +0 -1
  179. package/build/esm/logger.js +0 -1
  180. package/build/esm/logger.js.map +1 -1
  181. package/build/esm/markup/codemirror/create.d.ts +3 -1
  182. package/build/esm/markup/codemirror/create.js +5 -2
  183. package/build/esm/markup/codemirror/create.js.map +1 -1
  184. package/build/esm/markup/codemirror/gravity.js +0 -1
  185. package/build/esm/markup/codemirror/gravity.js.map +1 -1
  186. package/build/esm/shortcuts/default.js +0 -2
  187. package/build/esm/shortcuts/default.js.map +1 -1
  188. package/build/esm/table-utils/commands/removeRow.js +1 -2
  189. package/build/esm/table-utils/commands/removeRow.js.map +1 -1
  190. package/build/esm/toolbar/types.d.ts +2 -3
  191. package/build/esm/toolbar/types.js.map +1 -1
  192. package/build/esm/types/spec.d.ts +0 -1
  193. package/build/esm/types/spec.js.map +1 -1
  194. package/build/esm/utils/ecapeRegexp.d.ts +1 -2
  195. package/build/esm/utils/ecapeRegexp.js +1 -2
  196. package/build/esm/utils/ecapeRegexp.js.map +1 -1
  197. package/build/esm/utils/inputrules.js +2 -2
  198. package/build/esm/utils/inputrules.js.map +1 -1
  199. package/build/esm/version.js +1 -1
  200. package/build/esm/version.js.map +1 -1
  201. package/build/esm/view/hooks/useFilesGallery/constants.d.ts +5 -0
  202. package/build/esm/view/hooks/useFilesGallery/constants.js +9 -1
  203. package/build/esm/view/hooks/useFilesGallery/constants.js.map +1 -1
  204. package/build/esm/view/hooks/useFilesGallery/helpers.d.ts +8 -0
  205. package/build/esm/view/hooks/useFilesGallery/helpers.js +25 -0
  206. package/build/esm/view/hooks/useFilesGallery/helpers.js.map +1 -0
  207. package/build/esm/view/hooks/useFilesGallery/useFilesGallery.d.ts +0 -1
  208. package/build/esm/view/hooks/useFilesGallery/useFilesGallery.js +19 -21
  209. package/build/esm/view/hooks/useFilesGallery/useFilesGallery.js.map +1 -1
  210. package/build/styles.css +6 -14
  211. package/package.json +73 -49
@@ -1 +1 @@
1
- {"version":3,"file":"types.js","sourceRoot":"../../../src","sources":["bundle/types.ts"],"names":[],"mappings":";AAAA,mDAAmD","sourcesContent":["// public types, re-exported in src/bundle/index.ts\n\nimport type {ReactNode} from 'react';\n\nimport type {MarkupString} from '../common';\nimport type {EscapeConfig, Extension} from '../core';\nimport type {Logger2} from '../logger';\nimport type {CreateCodemirrorParams, YfmLangOptions} from '../markup';\nimport type {FileUploadHandler} from '../utils';\nimport type {DirectiveSyntaxContext, DirectiveSyntaxOption} from '../utils/directive';\n\nimport type {ChangeEditorModeOptions} from './Editor';\nimport type {ExtensionsOptions as WysiwygPresetExtensionsOptions} from './wysiwyg-preset';\n\nexport type {Editor as MarkdownEditorInstance} from './Editor';\nexport type MarkdownEditorMode = 'wysiwyg' | 'markup';\nexport type MarkdownEditorPreset = 'zero' | 'commonmark' | 'default' | 'yfm' | 'full';\nexport type MarkdownEditorSplitMode = false | 'horizontal' | 'vertical';\n\nexport type RenderPreviewParams = {\n getValue: () => MarkupString;\n mode: 'preview' | 'split';\n md: Readonly<MarkdownEditorMdOptions>;\n directiveSyntax: Pick<DirectiveSyntaxContext, 'option' | 'valueFor' | 'mdPluginValueFor'>;\n};\nexport type RenderPreview = (params: RenderPreviewParams) => ReactNode;\n\nexport type ParseInsertedUrlAsImage = (text: string) => {imageUrl: string; title?: string} | null;\n\nexport type WysiwygPlaceholderOptions = {\n value?: string | (() => string);\n /** Default – empty-doc\n Values:\n - 'empty-doc' – The placeholder will only be shown when the document is completely empty;\n - 'empty-row-top-level' – The placeholder will be displayed in an empty line that is at the top level of the document structure;\n - 'empty-row' – The placeholder will be shown in any empty line within the document, regardless of its nesting level.\n */\n behavior?: 'empty-doc' | 'empty-row-top-level' | 'empty-row';\n};\n\nexport type MarkdownEditorMdOptions = {\n html?: boolean;\n breaks?: boolean;\n linkify?: boolean;\n linkifyTlds?: string | string[];\n};\n\nexport type MarkdownEditorInitialOptions = {\n markup?: MarkupString;\n /** Default – wysiwyg */\n mode?: MarkdownEditorMode;\n /** Default – true */\n toolbarVisible?: boolean;\n /**\n * Default – false\n *\n * Note: has no effect if `MarkdownEditorMarkupConfig.splitMode` is set to false or is not set.\n */\n splitModeEnabled?: boolean;\n};\n\nexport type MarkdownEditorHandlers = {\n /** Pass this handler to allow uploading files from device. */\n uploadFile?: FileUploadHandler;\n};\n\nexport type MarkdownEditorExperimentalOptions = {\n /**\n * If we need to set dimensions for uploaded images\n *\n * @default false\n */\n needToSetDimensionsForUploadedImages?: boolean;\n /**\n * If we need to enable new image size calculations\n *\n * @default false\n */\n enableNewImageSizeCalculation?: boolean;\n /**\n * Called before switching from the markup editor to the wysiwyg editor.\n * You can use it to pre-process the value from the markup editor before it gets into the wysiwyg editor.\n */\n prepareRawMarkup?: (value: MarkupString) => MarkupString;\n beforeEditorModeChange?: (\n options: Pick<ChangeEditorModeOptions, 'mode' | 'reason'>,\n ) => boolean | undefined;\n /**\n * Enables support of directive syntax for diplodoc (YFM) extensions.\n *\n * **Note:** This setting affects parsing of markdown markup and serializing to markdown markup.\n * Be careful with it and use it in consistency with diplodoc/transform and diplodoc-extensions.\n *\n * Before enabling this option, make sure that appropriate versions of diplodoc/transform and diplodoc-extensions are installed.\n *\n * You can pass an object in `key:value` format to provide different behaviour for each extension individually.\n *\n * Values:\n * - 'disabled' – directive syntax is disabled;\n * - 'enabled' – directive syntax is enabled. Syntax of existing blocks is preserved. New blocks will be serialized using old syntax;\n * - 'preserve' – directive syntax is enabled. Syntax of existing blocks is preserved. New blocks will be serialized using directive syntax;\n * - 'overwrite' – existing blocks will be overwritten using directive syntax through serialization;\n * - 'only' – old syntax is disabled, only directive syntax available. Blocks in old syntax will not be parsed.\n *\n * Default value is 'disabled'.\n */\n directiveSyntax?: DirectiveSyntaxOption;\n /**\n * If we need support for empty strings\n *\n * @default false\n */\n preserveEmptyRows?: boolean;\n /**\n * Preserves the original formatting of unmodified blocks,\n * restoring their structure during serialization\n *\n * **Use case:** Maintain consistent markup when switching modes\n *\n * **Note:** Applies to tracked blocks: `yfm_table`\n *\n * @default false\n */\n preserveMarkupFormatting?: boolean;\n};\n\nexport type MarkdownEditorMarkupConfig = {\n /**\n * Pass the rendering function to preview the markdown content.\n *\n * It is also used for split view rendering.\n *\n * If false is passed, preview will be disabled.\n */\n renderPreview?: RenderPreview;\n /**\n * Pass position of split view.\n *\n * Note: for enable split view, you need to pass renderPreview function too.\n *\n * If false is passed, split view will be disabled.\n */\n splitMode?: MarkdownEditorSplitMode;\n /** Additional extensions for codemirror instance. */\n extensions?: CreateCodemirrorParams['extensions'];\n /** Can be used to disable some of the default extensions */\n disabledExtensions?: CreateCodemirrorParams['disabledExtensions'];\n /** Additional keymaps for codemirror instance */\n keymaps?: CreateCodemirrorParams['keymaps'];\n /** Overrides the default placeholder content. */\n placeholder?: CreateCodemirrorParams['placeholder'];\n /** Enable HTML parsing when pasting content. */\n parseHtmlOnPaste?: boolean;\n /**\n * Additional language data for markdown language in codemirror.\n * Can be used to configure additional autocompletions and others.\n * See more https://codemirror.net/docs/ref/#state.EditorState.languageDataAt\n */\n languageData?: YfmLangOptions['languageData'];\n /** Config for @codemirror/autocomplete https://codemirror.net/docs/ref/#autocomplete.autocompletion%5Econfig */\n autocompletion?: CreateCodemirrorParams['autocompletion'];\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 * Show search panel in the editor.\n * @default true\n */\n searchPanel?: boolean;\n};\n\n// do not export this type\ntype ExtensionsOptions<T extends object = {}> = Omit<\n WysiwygPresetExtensionsOptions,\n 'reactRenderer'\n> &\n T;\n\nexport type MarkdownEditorWysiwygConfig = {\n /** Additional extensions */\n extensions?: Extension;\n extensionOptions?: ExtensionsOptions;\n escapeConfig?: EscapeConfig;\n placeholderOptions?: WysiwygPlaceholderOptions;\n // MAJOR: remove markdown-it-attrs\n /**\n * Disable the markdown-it-attrs plugin in the markup parser.\n *\n * Note: The use of the markdown-it-attrs plugin will be removed in the next major version.\n */\n disableMarkdownAttrs?: boolean;\n /**\n * Show search panel in the editor.\n * @default true\n */\n searchPanel?: boolean;\n};\n\nexport type MarkdownEditorOptions = {\n /**\n * A set of plug-in extensions.\n *\n * @default 'full'\n */\n preset?: MarkdownEditorPreset;\n /** Markdown parser options */\n md?: MarkdownEditorMdOptions;\n /** Initial values */\n initial?: MarkdownEditorInitialOptions;\n handlers?: MarkdownEditorHandlers;\n experimental?: MarkdownEditorExperimentalOptions;\n /** Options for markup mode */\n markupConfig?: MarkdownEditorMarkupConfig;\n /** Options for wysiwyg mode */\n wysiwygConfig?: MarkdownEditorWysiwygConfig;\n logger?: Logger2.ILogger;\n /** Mobile view */\n mobile?: boolean;\n};\n"]}
1
+ {"version":3,"file":"types.js","sourceRoot":"../../../src","sources":["bundle/types.ts"],"names":[],"mappings":";AAAA,mDAAmD","sourcesContent":["// public types, re-exported in src/bundle/index.ts\n\nimport type {ReactNode} from 'react';\n\nimport type {MarkupString} from '../common';\nimport type {EscapeConfig, Extension} from '../core';\nimport type {Logger2} from '../logger';\nimport type {CreateCodemirrorParams, YfmLangOptions} from '../markup';\nimport type {FileUploadHandler} from '../utils';\nimport type {DirectiveSyntaxContext, DirectiveSyntaxOption} from '../utils/directive';\n\nimport type {ChangeEditorModeOptions} from './Editor';\nimport type {ExtensionsOptions as WysiwygPresetExtensionsOptions} from './wysiwyg-preset';\n\nexport type {Editor as MarkdownEditorInstance} from './Editor';\nexport type MarkdownEditorMode = 'wysiwyg' | 'markup';\nexport type MarkdownEditorPreset = 'zero' | 'commonmark' | 'default' | 'yfm' | 'full';\nexport type MarkdownEditorSplitMode = false | 'horizontal' | 'vertical';\n\nexport type RenderPreviewParams = {\n getValue: () => MarkupString;\n mode: 'preview' | 'split';\n md: Readonly<MarkdownEditorMdOptions>;\n directiveSyntax: Pick<DirectiveSyntaxContext, 'option' | 'valueFor' | 'mdPluginValueFor'>;\n};\nexport type RenderPreview = (params: RenderPreviewParams) => ReactNode;\n\nexport type ParseInsertedUrlAsImage = (text: string) => {imageUrl: string; title?: string} | null;\n\nexport type WysiwygPlaceholderOptions = {\n value?: string | (() => string);\n /**\n * Default – empty-doc.\n *\n * Values:\n * - 'empty-doc' – The placeholder will only be shown when the document is completely empty;\n * - 'empty-row-top-level' – The placeholder will be displayed in an empty line that is at the top level of the document structure;\n * - 'empty-row' – The placeholder will be shown in any empty line within the document, regardless of its nesting level.\n */\n behavior?: 'empty-doc' | 'empty-row-top-level' | 'empty-row';\n};\n\nexport type MarkdownEditorMdOptions = {\n html?: boolean;\n breaks?: boolean;\n linkify?: boolean;\n linkifyTlds?: string | string[];\n};\n\nexport type MarkdownEditorInitialOptions = {\n markup?: MarkupString;\n /** Default – wysiwyg */\n mode?: MarkdownEditorMode;\n /** Default – true */\n toolbarVisible?: boolean;\n /**\n * Default – false\n *\n * Note: has no effect if `MarkdownEditorMarkupConfig.splitMode` is set to false or is not set.\n */\n splitModeEnabled?: boolean;\n};\n\nexport type MarkdownEditorHandlers = {\n /** Pass this handler to allow uploading files from device. */\n uploadFile?: FileUploadHandler;\n};\n\nexport type MarkdownEditorExperimentalOptions = {\n /**\n * If we need to set dimensions for uploaded images\n * @default false\n */\n needToSetDimensionsForUploadedImages?: boolean;\n /**\n * If we need to enable new image size calculations\n * @default false\n */\n enableNewImageSizeCalculation?: boolean;\n /**\n * Called before switching from the markup editor to the wysiwyg editor.\n * You can use it to pre-process the value from the markup editor before it gets into the wysiwyg editor.\n */\n prepareRawMarkup?: (value: MarkupString) => MarkupString;\n beforeEditorModeChange?: (\n options: Pick<ChangeEditorModeOptions, 'mode' | 'reason'>,\n ) => boolean | undefined;\n /**\n * Enables support of directive syntax for diplodoc (YFM) extensions.\n *\n * **Note:** This setting affects parsing of markdown markup and serializing to markdown markup.\n * Be careful with it and use it in consistency with diplodoc/transform and diplodoc-extensions.\n *\n * Before enabling this option, make sure that appropriate versions of diplodoc/transform and diplodoc-extensions are installed.\n *\n * You can pass an object in `key:value` format to provide different behaviour for each extension individually.\n *\n * Values:\n * - 'disabled' – directive syntax is disabled;\n * - 'enabled' – directive syntax is enabled. Syntax of existing blocks is preserved. New blocks will be serialized using old syntax;\n * - 'preserve' – directive syntax is enabled. Syntax of existing blocks is preserved. New blocks will be serialized using directive syntax;\n * - 'overwrite' – existing blocks will be overwritten using directive syntax through serialization;\n * - 'only' – old syntax is disabled, only directive syntax available. Blocks in old syntax will not be parsed.\n *\n * Default value is 'disabled'.\n */\n directiveSyntax?: DirectiveSyntaxOption;\n /**\n * If we need support for empty strings\n * @default false\n */\n preserveEmptyRows?: boolean;\n /**\n * Preserves the original formatting of unmodified blocks,\n * restoring their structure during serialization\n *\n * **Use case:** Maintain consistent markup when switching modes\n *\n * **Note:** Applies to tracked blocks: `yfm_table`\n * @default false\n */\n preserveMarkupFormatting?: boolean;\n};\n\nexport type MarkdownEditorMarkupConfig = {\n /**\n * Pass the rendering function to preview the markdown content.\n *\n * It is also used for split view rendering.\n *\n * If false is passed, preview will be disabled.\n */\n renderPreview?: RenderPreview;\n /**\n * Pass position of split view.\n *\n * Note: for enable split view, you need to pass renderPreview function too.\n *\n * If false is passed, split view will be disabled.\n */\n splitMode?: MarkdownEditorSplitMode;\n /** Additional extensions for codemirror instance. */\n extensions?: CreateCodemirrorParams['extensions'];\n /** Can be used to disable some of the default extensions */\n disabledExtensions?: CreateCodemirrorParams['disabledExtensions'];\n /** Additional keymaps for codemirror instance */\n keymaps?: CreateCodemirrorParams['keymaps'];\n /** Overrides the default placeholder content. */\n placeholder?: CreateCodemirrorParams['placeholder'];\n /** Enable HTML parsing when pasting content. */\n parseHtmlOnPaste?: boolean;\n /**\n * Additional language data for markdown language in codemirror.\n * Can be used to configure additional autocompletions and others.\n * See more https://codemirror.net/docs/ref/#state.EditorState.languageDataAt\n */\n languageData?: YfmLangOptions['languageData'];\n /** Config for @codemirror/autocomplete https://codemirror.net/docs/ref/#autocomplete.autocompletion%5Econfig */\n autocompletion?: CreateCodemirrorParams['autocompletion'];\n /** Config for tooltips https://codemirror.net/docs/ref/#view.tooltips */\n tooltips?: CreateCodemirrorParams['tooltips'];\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 * Show search panel in the editor.\n * @default true\n */\n searchPanel?: boolean;\n};\n\n// do not export this type\ntype ExtensionsOptions<T extends object = {}> = Omit<\n WysiwygPresetExtensionsOptions,\n 'reactRenderer'\n> &\n T;\n\nexport type MarkdownEditorWysiwygConfig = {\n /** Additional extensions */\n extensions?: Extension;\n extensionOptions?: ExtensionsOptions;\n escapeConfig?: EscapeConfig;\n placeholderOptions?: WysiwygPlaceholderOptions;\n // MAJOR: remove markdown-it-attrs\n /**\n * Disable the markdown-it-attrs plugin in the markup parser.\n *\n * Note: The use of the markdown-it-attrs plugin will be removed in the next major version.\n */\n disableMarkdownAttrs?: boolean;\n /**\n * Show search panel in the editor.\n * @default true\n */\n searchPanel?: boolean;\n};\n\nexport type MarkdownEditorOptions = {\n /**\n * A set of plug-in extensions.\n * @default 'full'\n */\n preset?: MarkdownEditorPreset;\n /** Markdown parser options */\n md?: MarkdownEditorMdOptions;\n /** Initial values */\n initial?: MarkdownEditorInitialOptions;\n handlers?: MarkdownEditorHandlers;\n experimental?: MarkdownEditorExperimentalOptions;\n /** Options for markup mode */\n markupConfig?: MarkdownEditorMarkupConfig;\n /** Options for wysiwyg mode */\n wysiwygConfig?: MarkdownEditorWysiwygConfig;\n logger?: Logger2.ILogger;\n /** Mobile view */\n mobile?: boolean;\n};\n"]}
@@ -14,7 +14,6 @@ export type BundlePresetOptions = ExtensionsOptions & EditorModeKeymapOptions &
14
14
  placeholderOptions?: WysiwygPlaceholderOptions;
15
15
  /**
16
16
  * If we need to set dimensions for uploaded images
17
- *
18
17
  * @default false
19
18
  */
20
19
  needToSetDimensionsForUploadedImages?: boolean;
@@ -51,7 +51,7 @@ const BundlePreset = (builder, opts) => {
51
51
  return null;
52
52
  return typeof value === 'function'
53
53
  ? value()
54
- : value ?? (0, placeholder_1.i18n)(opts.mobile ? 'doc_empty_mobile' : 'doc_empty');
54
+ : (value ?? (0, placeholder_1.i18n)(opts.mobile ? 'doc_empty_mobile' : 'doc_empty'));
55
55
  },
56
56
  preserveEmptyRows: opts.preserveEmptyRows,
57
57
  ...opts.baseSchema,
@@ -1 +1 @@
1
- {"version":3,"file":"wysiwyg-preset.js","sourceRoot":"../../../src","sources":["bundle/wysiwyg-preset.ts"],"names":[],"mappings":";;;AAGA,8DAAkF;AAClF,uFAGiD;AACjD,kDAA0E;AAC1E,8DAA4D;AAC5D,yDAAqF;AACrF,mDAA4E;AAC5E,6CAAmE;AACnE,2CAAgE;AAChE,6CAAmE;AACnE,qDAAyD;AAIzD,iDAA0F;AAC1F,sCAAkC;AAGlC,MAAM,oBAAoB,GAAG,CAAC,KAAK,EAAE,WAAW,CAAU,CAAC;AAiCpD,MAAM,YAAY,GAAuC,CAAC,OAAO,EAAE,IAAI,EAAE,EAAE;IAC9E,OAAO,CAAC,OAAO,CAAC,GAAG,CAAC,iBAAiB,EAAE,IAAI,CAAC,eAAe,CAAC,CAAC;IAE7D,MAAM,UAAU,GAA8D;QAC1E,KAAK,EAAE,2BAA2B;QAClC,KAAK,EAAE,CAAC;KACX,CAAC;IAEF,MAAM,WAAW,GAA8C;QAC3D,GAAG,IAAI;QACP,UAAU,EAAE;YACR,UAAU,EAAE;gBACR,uEAAuE;gBACvE,kEAAkE;gBAClE,2DAA2D;gBAC3D,WAAW,EAAE,EAAE;gBACf,GAAG,IAAI,CAAC,UAAU,EAAE,UAAU;aACjC;SACJ;QACD,MAAM,EAAE,EAAC,WAAW,EAAE,UAAU,EAAC;QACjC,MAAM,EAAE,IAAI,CAAC,WAAW,CAAC,CAAC,CAAC,EAAC,cAAc,EAAE,6BAA6B,EAAC,CAAC,CAAC,CAAC,SAAS;QACtF,SAAS,EAAE,EAAC,gBAAgB,EAAE,IAAI,CAAC,iBAAiB,EAAE,GAAG,IAAI,CAAC,SAAS,EAAC;QACxE,gBAAgB,EAAE,EAAC,MAAM,EAAE,sCAA4B,CAAC,IAAI,EAAE,GAAG,IAAI,CAAC,gBAAgB,EAAC;QACvF,WAAW,EAAE,EAAC,OAAO,EAAE,oCAA0B,CAAC,IAAI,EAAE,GAAG,IAAI,CAAC,WAAW,EAAC;QAC5E,OAAO,EAAE,EAAC,OAAO,EAAE,qBAAC,CAAC,IAAI,CAAC,kBAAC,CAAC,IAAI,CAAC,EAAE,OAAO,EAAE,qBAAC,CAAC,IAAI,CAAC,kBAAC,CAAC,IAAI,CAAC,EAAE,GAAG,IAAI,CAAC,OAAO,EAAC;QAC5E,UAAU,EAAE;YACR,YAAY,EAAE,qBAAC,CAAC,IAAI,CAAC,kBAAC,CAAC,IAAI,CAAC;YAC5B,oBAAoB,EAAE,CAAC,IAAU,EAAE,MAAoB,EAAE,EAAE;gBACvD,MAAM,EAAC,KAAK,EAAE,QAAQ,EAAC,GAAG,IAAI,CAAC,kBAAkB,IAAI,EAAE,CAAC;gBAExD,MAAM,YAAY,GAAG;oBACjB,WAAW,EAAE,CAAC,IAAI,CAAC,IAAI;oBACvB,qBAAqB,EAAE,CAAC,IAAI,CAAC,IAAI,IAAI,MAAM,EAAE,IAAI,CAAC,IAAI,KAAK,gBAAQ,CAAC,GAAG;oBACvE,WAAW,EACP,CAAC,IAAI,CAAC,IAAI,IAAI,MAAM,EAAE,IAAI,CAAC,IAAI,KAAK,gBAAQ,CAAC,GAAG,IAAI,MAAM,CAAC,UAAU,KAAK,CAAC;iBAClF,CAAC;gBAEF,MAAM,eAAe,GAAG,YAAY,CAAC,QAAQ,IAAI,WAAW,CAAC,CAAC;gBAE9D,IAAI,CAAC,eAAe;oBAAE,OAAO,IAAI,CAAC;gBAElC,OAAO,OAAO,KAAK,KAAK,UAAU;oBAC9B,CAAC,CAAC,KAAK,EAAE;oBACT,CAAC,CAAC,KAAK,IAAI,IAAA,kBAAe,EAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,kBAAkB,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC;YACnF,CAAC;YACD,iBAAiB,EAAE,IAAI,CAAC,iBAAiB;YACzC,GAAG,IAAI,CAAC,UAAU;SACrB;KACJ,CAAC;IACF,MAAM,iBAAiB,GAAoD;QACvE,GAAG,WAAW;QACd,gBAAgB,EAAE;YACd,MAAM,EAAE,sCAA4B,CAAC,UAAU;YAC/C,GAAG,IAAI,CAAC,gBAAgB;SAC3B;QACD,WAAW,EAAE,EAAC,OAAO,EAAE,oCAA0B,CAAC,UAAU,EAAE,GAAG,IAAI,CAAC,WAAW,EAAC;QAClF,MAAM,EAAE;YACJ,cAAc,EAAE,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM,CAAoB;YACpE,GAAG,IAAI,CAAC,MAAM;SACjB;QACD,IAAI,EAAE,EAAC,OAAO,EAAE,qBAAC,CAAC,IAAI,CAAC,kBAAC,CAAC,IAAI,CAAC,EAAE,GAAG,IAAI,CAAC,IAAI,EAAC;QAC7C,MAAM,EAAE,EAAC,SAAS,EAAE,qBAAC,CAAC,IAAI,CAAC,kBAAC,CAAC,MAAM,CAAC,EAAE,GAAG,IAAI,CAAC,MAAM,EAAC;QACrD,IAAI,EAAE,EAAC,OAAO,EAAE,qBAAC,CAAC,IAAI,CAAC,kBAAC,CAAC,IAAI,CAAC,EAAE,GAAG,IAAI,CAAC,IAAI,EAAC;QAC7C,SAAS,EAAE;YACP,YAAY,EAAE,qBAAC,CAAC,IAAI,CAAC,kBAAC,CAAC,SAAS,CAAC;YACjC,GAAG,IAAI,CAAC,SAAS;SACpB;QACD,UAAU,EAAE,EAAC,QAAQ,EAAE,qBAAC,CAAC,IAAI,CAAC,kBAAC,CAAC,KAAK,CAAC,EAAE,GAAG,IAAI,CAAC,UAAU,EAAC;QAC3D,IAAI,EAAE,EAAC,OAAO,EAAE,qBAAC,CAAC,IAAI,CAAC,kBAAC,CAAC,IAAI,CAAC,EAAE,GAAG,IAAI,CAAC,IAAI,EAAC;QAC7C,KAAK,EAAE;YACH,KAAK,EAAE,qBAAC,CAAC,IAAI,CAAC,kBAAC,CAAC,UAAU,CAAC;YAC3B,KAAK,EAAE,qBAAC,CAAC,IAAI,CAAC,kBAAC,CAAC,WAAW,CAAC;YAC5B,YAAY,EAAE,EAAC,IAAI,EAAE,KAAK,EAAC;YAC3B,GAAG,IAAI,CAAC,KAAK;SAChB;QACD,KAAK,EAAE;YACH,uBAAuB,EAAE,IAAI,CAAC,OAAO,EAAE,uBAAuB;SACjE;KACJ,CAAC;IACF,MAAM,cAAc,GAAiD;QACjE,GAAG,iBAAiB;QACpB,gBAAgB,EAAE,EAAC,MAAM,EAAE,sCAA4B,CAAC,OAAO,EAAE,GAAG,IAAI,CAAC,gBAAgB,EAAC;QAC1F,WAAW,EAAE,EAAC,OAAO,EAAE,oCAA0B,CAAC,OAAO,EAAE,GAAG,IAAI,CAAC,WAAW,EAAC;QAC/E,MAAM,EAAE,EAAC,SAAS,EAAE,qBAAC,CAAC,IAAI,CAAC,kBAAC,CAAC,MAAM,CAAC,EAAE,GAAG,IAAI,CAAC,MAAM,EAAC;KACxD,CAAC;IACF,MAAM,UAAU,GAA6C;QACzD,GAAG,cAAc;QACjB,UAAU,EAAE,EAAC,YAAY,EAAE,IAAI,CAAC,cAAc,EAAE,GAAG,IAAI,CAAC,UAAU,EAAC;QACnE,gBAAgB,EAAE,EAAC,MAAM,EAAE,sCAA4B,CAAC,GAAG,EAAE,GAAG,IAAI,CAAC,gBAAgB,EAAC;QACtF,WAAW,EAAE,EAAC,OAAO,EAAE,oCAA0B,CAAC,GAAG,EAAE,GAAG,IAAI,CAAC,WAAW,EAAC;QAC3E,SAAS,EAAE,EAAC,YAAY,EAAE,qBAAC,CAAC,IAAI,CAAC,kBAAC,CAAC,SAAS,CAAC,EAAE,GAAG,IAAI,CAAC,SAAS,EAAC;QACjE,OAAO,EAAE;YACL,kBAAkB,EAAE,IAAI,CAAC,iBAAiB;YAC1C,oCAAoC,EAAE,IAAI,CAAC,oCAAoC;YAC/E,6BAA6B,EAAE,IAAI,CAAC,6BAA6B;YACjE,GAAG,IAAI,CAAC,OAAO;SAClB;QACD,QAAQ,EAAE,EAAC,wBAAwB,EAAE,GAAG,EAAE,CAAC,IAAA,kBAAe,EAAC,UAAU,CAAC,EAAE,GAAG,IAAI,CAAC,QAAQ,EAAC;QACzF,OAAO,EAAE;YACL,sBAAsB,EAAE,GAAG,EAAE,CAAC,IAAA,kBAAe,EAAC,cAAc,CAAC;YAC7D,sBAAsB,EAAE,GAAG,EAAE,CAAC,IAAA,kBAAe,EAAC,cAAc,CAAC;SAChE;QACD,MAAM,EAAE;YACJ,SAAS,EAAE,qBAAC,CAAC,IAAI,CAAC,kBAAC,CAAC,GAAG,CAAC;YACxB,sBAAsB,EAAE,GAAG,EAAE,CAAC,IAAA,kBAAe,EAAC,WAAW,CAAC;YAC1D,wBAAwB,EAAE,GAAG,EAAE,CAAC,IAAA,kBAAe,EAAC,aAAa,CAAC;YAC9D,GAAG,IAAI,CAAC,MAAM;SACjB;QACD,OAAO,EAAE;YACL,UAAU,EAAE,qBAAC,CAAC,IAAI,CAAC,kBAAC,CAAC,IAAI,CAAC;YAC1B,uBAAuB,EAAE,GAAG,EAAE,CAAC,IAAA,kBAAe,EAAC,YAAY,CAAC;YAC5D,GAAG,IAAI,CAAC,OAAO;SAClB;QACD,QAAQ,EAAE;YACN,uBAAuB,EAAE,GAAG,EAAE,CAAC,IAAA,kBAAe,EAAC,YAAY,CAAC;YAC5D,GAAG,IAAI,CAAC,QAAQ;YAChB,QAAQ,EAAE,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC,QAAQ,EAAE,QAAQ;SAC1D;QACD,OAAO,EAAE;YACL,iBAAiB,EAAE,IAAI,CAAC,iBAAiB;YACzC,oCAAoC,EAAE,IAAI,CAAC,oCAAoC;YAC/E,GAAG,IAAI,CAAC,OAAO;SAClB;QACD,UAAU,EAAE;YACR,KAAK,EAAE,qBAAC,CAAC,IAAI,CAAC,kBAAC,CAAC,QAAQ,CAAC;YACzB,KAAK,EAAE,qBAAC,CAAC,IAAI,CAAC,kBAAC,CAAC,QAAQ,CAAC;YACzB,KAAK,EAAE,qBAAC,CAAC,IAAI,CAAC,kBAAC,CAAC,QAAQ,CAAC;YACzB,KAAK,EAAE,qBAAC,CAAC,IAAI,CAAC,kBAAC,CAAC,QAAQ,CAAC;YACzB,KAAK,EAAE,qBAAC,CAAC,IAAI,CAAC,kBAAC,CAAC,QAAQ,CAAC;YACzB,KAAK,EAAE,qBAAC,CAAC,IAAI,CAAC,kBAAC,CAAC,QAAQ,CAAC;YACzB,kBAAkB,EAAE,CAAC,IAAU,EAAE,EAAE,CAC/B,GAAG,IAAA,kBAAe,EAAC,SAAS,CAAC,IAAI,IAAI,CAAC,KAAK,CAAC,sBAAc,CAAC,KAAK,CAAC,EAAE,EAAE,4BAA4B;YACrG,GAAG,IAAI,CAAC,UAAU;SACrB;QACD,WAAW,EAAE;YACT,CAAC,mBAAW,CAAC,WAAW,CAAC,EAAE,GAAG,EAAE,CAAC,IAAA,kBAAe,EAAC,cAAc,CAAC;SACnE;KACJ,CAAC;IACF,MAAM,WAAW,GAA8C;QAC3D,GAAG,UAAU;QACb,gBAAgB,EAAE,EAAC,MAAM,EAAE,sCAA4B,CAAC,IAAI,EAAE,GAAG,IAAI,CAAC,gBAAgB,EAAC;QACvF,WAAW,EAAE,EAAC,OAAO,EAAE,oCAA0B,CAAC,IAAI,EAAE,GAAG,IAAI,CAAC,WAAW,EAAC;QAC5E,KAAK,EAAE,EAAC,IAAI,EAAE,iBAAS,EAAE,GAAG,IAAI,CAAC,KAAK,EAAC;KAC1C,CAAC;IAEF,MAAM,iBAAiB,GAAG,CAAC,kBAAC,CAAC,IAAI,EAAE,kBAAC,CAAC,IAAI,CAAC,CAAC;IAC3C,MAAM,uBAAuB,GAAG,iBAAiB,CAAC,MAAM,CACpD,kBAAC,CAAC,IAAI,EACN,kBAAC,CAAC,MAAM,EACR,kBAAC,CAAC,IAAI,EACN,kBAAC,CAAC,IAAI,EAEN,kBAAC,CAAC,IAAI,EACN,kBAAC,CAAC,QAAQ,EACV,kBAAC,CAAC,QAAQ,EACV,kBAAC,CAAC,QAAQ,EACV,kBAAC,CAAC,QAAQ,EACV,kBAAC,CAAC,QAAQ,EACV,kBAAC,CAAC,QAAQ,EAEV,kBAAC,CAAC,UAAU,EACZ,kBAAC,CAAC,WAAW,EAEb,kBAAC,CAAC,KAAK,EACP,kBAAC,CAAC,SAAS,CACd,CAAC;IACF,MAAM,oBAAoB,GAAG,uBAAuB,CAAC,MAAM,CAAC,kBAAC,CAAC,MAAM,CAAC,CAAC;IACtE,MAAM,gBAAgB,GAAG,oBAAoB,CAAC,MAAM,CAChD,kBAAC,CAAC,SAAS,EAEX,kBAAC,CAAC,IAAI,EACN,kBAAC,CAAC,GAAG,CACR,CAAC;IACF,MAAM,iBAAiB,GAAG,gBAAgB,CAAC,MAAM,EAAE,CAAC;IAEpD,IAAI,aAAa,CAAC;IAElB,QAAQ,IAAI,CAAC,MAAM,EAAE,CAAC;QAClB,KAAK,MAAM,CAAC,CAAC,CAAC;YACV,aAAa,GAAG,iBAAiB,CAAC;YAClC,OAAO,CAAC,GAAG,CAAC,yBAAc,EAAE,WAAW,CAAC,CAAC,GAAG,CAAC,iBAAU,EAAE,WAAW,CAAC,CAAC;YACtE,MAAM;QACV,CAAC;QACD,KAAK,YAAY,CAAC,CAAC,CAAC;YAChB,aAAa,GAAG,uBAAuB,CAAC;YACxC,OAAO,CAAC,GAAG,CAAC,yBAAc,EAAE,iBAAiB,CAAC,CAAC,GAAG,CAAC,6BAAgB,EAAE,iBAAiB,CAAC,CAAC;YACxF,MAAM;QACV,CAAC;QACD,KAAK,SAAS,CAAC,CAAC,CAAC;YACb,aAAa,GAAG,oBAAoB,CAAC;YACrC,OAAO,CAAC,GAAG,CAAC,yBAAc,EAAE,cAAc,CAAC,CAAC,GAAG,CAAC,uBAAa,EAAE,cAAc,CAAC,CAAC;YAC/E,MAAM;QACV,CAAC;QACD,KAAK,KAAK,CAAC,CAAC,CAAC;YACT,aAAa,GAAG,gBAAgB,CAAC;YACjC,OAAO,CAAC,GAAG,CAAC,yBAAc,EAAE,UAAU,CAAC,CAAC,GAAG,CAAC,eAAS,EAAE,UAAU,CAAC,CAAC;YACnE,MAAM;QACV,CAAC;QACD,OAAO,CAAC,CAAC,CAAC;YACN,aAAa,GAAG,iBAAiB,CAAC;YAClC,OAAO,CAAC,GAAG,CAAC,yBAAc,EAAE,WAAW,CAAC,CAAC,GAAG,CAAC,iBAAU,EAAE,WAAW,CAAC,CAAC;YACtE,MAAM;QACV,CAAC;IACL,CAAC;IAED,MAAM,cAAc,GAAG,IAAI,CAAC,cAAc,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC;IAC1D,cAAc,CAAC,IAAI,CAAC,GAAG,oBAAoB,CAAC,CAAC;IAC7C,KAAK,MAAM,MAAM,IAAI,aAAa,EAAE,CAAC;QACjC,MAAM,GAAG,GAAG,qBAAC,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;QAC3B,IAAI,GAAG;YAAE,cAAc,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IACtC,CAAC;IAED,OAAO,CAAC,GAAG,CAAC,mCAAgB,EAAE;QAC1B,QAAQ,EAAE,IAAI,CAAC,QAAQ;QACvB,QAAQ,EAAE,IAAI,CAAC,QAAQ;QACvB,cAAc;KACjB,CAAC,CAAC;AACP,CAAC,CAAC;AAzNW,QAAA,YAAY,gBAyNvB","sourcesContent":["import type {Node} from 'prosemirror-model';\n\nimport type {ExtensionAuto} from '../core';\nimport {BehaviorPreset, type BehaviorPresetOptions} from '../extensions/behavior';\nimport {\n EditorModeKeymap,\n type EditorModeKeymapOptions,\n} from '../extensions/behavior/EditorModeKeymap';\nimport {BaseNode, YfmHeadingAttr, YfmNoteNode} from '../extensions/specs';\nimport {i18n as i18nPlaceholder} from '../i18n/placeholder';\nimport {CommonMarkPreset, type CommonMarkPresetOptions} from '../presets/commonmark';\nimport {DefaultPreset, type DefaultPresetOptions} from '../presets/default';\nimport {FullPreset, type FullPresetOptions} from '../presets/full';\nimport {YfmPreset, type YfmPresetOptions} from '../presets/yfm';\nimport {ZeroPreset, type ZeroPresetOptions} from '../presets/zero';\nimport {Action as A, formatter as f} from '../shortcuts';\nimport type {DirectiveSyntaxContext} from '../utils/directive';\nimport type {FileUploadHandler} from '../utils/upload';\n\nimport {wCommandMenuConfigByPreset, wSelectionMenuConfigByPreset} from './config/wysiwyg';\nimport {emojiDefs} from './emoji';\nimport type {MarkdownEditorPreset, WysiwygPlaceholderOptions} from './types';\n\nconst DEFAULT_IGNORED_KEYS = ['Tab', 'Shift-Tab'] as const;\n\nexport type ExtensionsOptions = BehaviorPresetOptions & FullPresetOptions;\n\nexport type BundlePresetOptions = ExtensionsOptions &\n EditorModeKeymapOptions & {\n preset: MarkdownEditorPreset;\n mdBreaks?: boolean;\n preserveEmptyRows?: boolean;\n fileUploadHandler?: FileUploadHandler;\n placeholderOptions?: WysiwygPlaceholderOptions;\n /**\n * If we need to set dimensions for uploaded images\n *\n * @default false\n */\n needToSetDimensionsForUploadedImages?: boolean;\n enableNewImageSizeCalculation?: boolean;\n directiveSyntax: DirectiveSyntaxContext;\n // MAJOR: remove markdown-it-attrs\n disableMdAttrs?: boolean;\n mobile?: boolean;\n searchPanel: boolean;\n };\n\ndeclare global {\n namespace WysiwygEditor {\n interface Context {\n directiveSyntax: DirectiveSyntaxContext;\n }\n }\n}\n\nexport const BundlePreset: ExtensionAuto<BundlePresetOptions> = (builder, opts) => {\n builder.context.set('directiveSyntax', opts.directiveSyntax);\n\n const dropCursor: NonNullable<BundlePresetOptions['cursor']>['dropOptions'] = {\n color: 'var(--g-color-line-brand)',\n width: 2,\n };\n\n const zeroOptions: BehaviorPresetOptions & ZeroPresetOptions = {\n ...opts,\n baseStyles: {\n attributes: {\n // for disable setting attrs inside pm-view from floating-ui from uikit\n // see https://github.com/floating-ui/floating-ui/discussions/3213\n // and https://github.com/floating-ui/floating-ui/pull/3202\n 'aria-live': '',\n ...opts.baseStyles?.attributes,\n },\n },\n cursor: {dropOptions: dropCursor},\n search: opts.searchPanel ? {anchorSelector: '.g-md-search-wysiwyg-anchor'} : undefined,\n clipboard: {pasteFileHandler: opts.fileUploadHandler, ...opts.clipboard},\n selectionContext: {config: wSelectionMenuConfigByPreset.zero, ...opts.selectionContext},\n commandMenu: {actions: wCommandMenuConfigByPreset.zero, ...opts.commandMenu},\n history: {undoKey: f.toPM(A.Undo), redoKey: f.toPM(A.Redo), ...opts.history},\n baseSchema: {\n paragraphKey: f.toPM(A.Text),\n paragraphPlaceholder: (node: Node, parent?: Node | null) => {\n const {value, behavior} = opts.placeholderOptions || {};\n\n const emptyEntries = {\n 'empty-row': !node.text,\n 'empty-row-top-level': !node.text && parent?.type.name === BaseNode.Doc,\n 'empty-doc':\n !node.text && parent?.type.name === BaseNode.Doc && parent.childCount === 1,\n };\n\n const showPlaceholder = emptyEntries[behavior || 'empty-doc'];\n\n if (!showPlaceholder) return null;\n\n return typeof value === 'function'\n ? value()\n : value ?? i18nPlaceholder(opts.mobile ? 'doc_empty_mobile' : 'doc_empty');\n },\n preserveEmptyRows: opts.preserveEmptyRows,\n ...opts.baseSchema,\n },\n };\n const commonMarkOptions: BehaviorPresetOptions & CommonMarkPresetOptions = {\n ...zeroOptions,\n selectionContext: {\n config: wSelectionMenuConfigByPreset.commonmark,\n ...opts.selectionContext,\n },\n commandMenu: {actions: wCommandMenuConfigByPreset.commonmark, ...opts.commandMenu},\n breaks: {\n preferredBreak: (opts.mdBreaks ? 'soft' : 'hard') as 'soft' | 'hard',\n ...opts.breaks,\n },\n bold: {boldKey: f.toPM(A.Bold), ...opts.bold},\n italic: {italicKey: f.toPM(A.Italic), ...opts.italic},\n code: {codeKey: f.toPM(A.Code), ...opts.code},\n codeBlock: {\n codeBlockKey: f.toPM(A.CodeBlock),\n ...opts.codeBlock,\n },\n blockquote: {qouteKey: f.toPM(A.Quote), ...opts.blockquote},\n link: {linkKey: f.toPM(A.Link), ...opts.link},\n lists: {\n ulKey: f.toPM(A.BulletList),\n olKey: f.toPM(A.OrderedList),\n ulInputRules: {plus: false},\n ...opts.lists,\n },\n image: {\n parseInsertedUrlAsImage: opts.imgSize?.parseInsertedUrlAsImage,\n },\n };\n const defaultOptions: BehaviorPresetOptions & DefaultPresetOptions = {\n ...commonMarkOptions,\n selectionContext: {config: wSelectionMenuConfigByPreset.default, ...opts.selectionContext},\n commandMenu: {actions: wCommandMenuConfigByPreset.default, ...opts.commandMenu},\n strike: {strikeKey: f.toPM(A.Strike), ...opts.strike},\n };\n const yfmOptions: BehaviorPresetOptions & YfmPresetOptions = {\n ...defaultOptions,\n yfmConfigs: {disableAttrs: opts.disableMdAttrs, ...opts.yfmConfigs},\n selectionContext: {config: wSelectionMenuConfigByPreset.yfm, ...opts.selectionContext},\n commandMenu: {actions: wCommandMenuConfigByPreset.yfm, ...opts.commandMenu},\n underline: {underlineKey: f.toPM(A.Underline), ...opts.underline},\n imgSize: {\n imageUploadHandler: opts.fileUploadHandler,\n needToSetDimensionsForUploadedImages: opts.needToSetDimensionsForUploadedImages,\n enableNewImageSizeCalculation: opts.enableNewImageSizeCalculation,\n ...opts.imgSize,\n },\n checkbox: {checkboxLabelPlaceholder: () => i18nPlaceholder('checkbox'), ...opts.checkbox},\n deflist: {\n deflistTermPlaceholder: () => i18nPlaceholder('deflist_term'),\n deflistDescPlaceholder: () => i18nPlaceholder('deflist_desc'),\n },\n yfmCut: {\n yfmCutKey: f.toPM(A.Cut),\n yfmCutTitlePlaceholder: () => i18nPlaceholder('cut_title'),\n yfmCutContentPlaceholder: () => i18nPlaceholder('cut_content'),\n ...opts.yfmCut,\n },\n yfmNote: {\n yfmNoteKey: f.toPM(A.Note),\n yfmNoteTitlePlaceholder: () => i18nPlaceholder('note_title'),\n ...opts.yfmNote,\n },\n yfmTable: {\n yfmTableCellPlaceholder: () => i18nPlaceholder('table_cell'),\n ...opts.yfmTable,\n controls: opts.mobile ? false : opts.yfmTable?.controls,\n },\n yfmFile: {\n fileUploadHandler: opts.fileUploadHandler,\n needToSetDimensionsForUploadedImages: opts.needToSetDimensionsForUploadedImages,\n ...opts.yfmFile,\n },\n yfmHeading: {\n h1Key: f.toPM(A.Heading1),\n h2Key: f.toPM(A.Heading2),\n h3Key: f.toPM(A.Heading3),\n h4Key: f.toPM(A.Heading4),\n h5Key: f.toPM(A.Heading5),\n h6Key: f.toPM(A.Heading6),\n headingPlaceholder: (node: Node) =>\n `${i18nPlaceholder('heading')} ${node.attrs[YfmHeadingAttr.Level]}`, // todo: remove attrs import\n ...opts.yfmHeading,\n },\n placeholder: {\n [YfmNoteNode.NoteContent]: () => i18nPlaceholder('note_content'),\n },\n };\n const fullOptions: BehaviorPresetOptions & FullPresetOptions = {\n ...yfmOptions,\n selectionContext: {config: wSelectionMenuConfigByPreset.full, ...opts.selectionContext},\n commandMenu: {actions: wCommandMenuConfigByPreset.full, ...opts.commandMenu},\n emoji: {defs: emojiDefs, ...opts.emoji},\n };\n\n const zeroIgnoreActions = [A.Undo, A.Redo];\n const commonMarkIgnoreActions = zeroIgnoreActions.concat(\n A.Bold,\n A.Italic,\n A.Code,\n A.Link,\n\n A.Text,\n A.Heading1,\n A.Heading2,\n A.Heading3,\n A.Heading4,\n A.Heading5,\n A.Heading6,\n\n A.BulletList,\n A.OrderedList,\n\n A.Quote,\n A.CodeBlock,\n );\n const defaultIgnoreActions = commonMarkIgnoreActions.concat(A.Strike);\n const yfmIgnoreActions = defaultIgnoreActions.concat(\n A.Underline,\n\n A.Note,\n A.Cut,\n );\n const fullIgnoreActions = yfmIgnoreActions.concat();\n\n let ignoreActions;\n\n switch (opts.preset) {\n case 'zero': {\n ignoreActions = zeroIgnoreActions;\n builder.use(BehaviorPreset, zeroOptions).use(ZeroPreset, zeroOptions);\n break;\n }\n case 'commonmark': {\n ignoreActions = commonMarkIgnoreActions;\n builder.use(BehaviorPreset, commonMarkOptions).use(CommonMarkPreset, commonMarkOptions);\n break;\n }\n case 'default': {\n ignoreActions = defaultIgnoreActions;\n builder.use(BehaviorPreset, defaultOptions).use(DefaultPreset, defaultOptions);\n break;\n }\n case 'yfm': {\n ignoreActions = yfmIgnoreActions;\n builder.use(BehaviorPreset, yfmOptions).use(YfmPreset, yfmOptions);\n break;\n }\n default: {\n ignoreActions = fullIgnoreActions;\n builder.use(BehaviorPreset, fullOptions).use(FullPreset, fullOptions);\n break;\n }\n }\n\n const ignoreKeysList = opts.ignoreKeysList?.slice() ?? [];\n ignoreKeysList.push(...DEFAULT_IGNORED_KEYS);\n for (const action of ignoreActions) {\n const key = f.toPM(action);\n if (key) ignoreKeysList.push(key);\n }\n\n builder.use(EditorModeKeymap, {\n onSubmit: opts.onSubmit,\n onCancel: opts.onCancel,\n ignoreKeysList,\n });\n};\n"]}
1
+ {"version":3,"file":"wysiwyg-preset.js","sourceRoot":"../../../src","sources":["bundle/wysiwyg-preset.ts"],"names":[],"mappings":";;;AAGA,8DAAkF;AAClF,uFAGiD;AACjD,kDAA0E;AAC1E,8DAA4D;AAC5D,yDAAqF;AACrF,mDAA4E;AAC5E,6CAAmE;AACnE,2CAAgE;AAChE,6CAAmE;AACnE,qDAAyD;AAIzD,iDAA0F;AAC1F,sCAAkC;AAGlC,MAAM,oBAAoB,GAAG,CAAC,KAAK,EAAE,WAAW,CAAU,CAAC;AAgCpD,MAAM,YAAY,GAAuC,CAAC,OAAO,EAAE,IAAI,EAAE,EAAE;IAC9E,OAAO,CAAC,OAAO,CAAC,GAAG,CAAC,iBAAiB,EAAE,IAAI,CAAC,eAAe,CAAC,CAAC;IAE7D,MAAM,UAAU,GAA8D;QAC1E,KAAK,EAAE,2BAA2B;QAClC,KAAK,EAAE,CAAC;KACX,CAAC;IAEF,MAAM,WAAW,GAA8C;QAC3D,GAAG,IAAI;QACP,UAAU,EAAE;YACR,UAAU,EAAE;gBACR,uEAAuE;gBACvE,kEAAkE;gBAClE,2DAA2D;gBAC3D,WAAW,EAAE,EAAE;gBACf,GAAG,IAAI,CAAC,UAAU,EAAE,UAAU;aACjC;SACJ;QACD,MAAM,EAAE,EAAC,WAAW,EAAE,UAAU,EAAC;QACjC,MAAM,EAAE,IAAI,CAAC,WAAW,CAAC,CAAC,CAAC,EAAC,cAAc,EAAE,6BAA6B,EAAC,CAAC,CAAC,CAAC,SAAS;QACtF,SAAS,EAAE,EAAC,gBAAgB,EAAE,IAAI,CAAC,iBAAiB,EAAE,GAAG,IAAI,CAAC,SAAS,EAAC;QACxE,gBAAgB,EAAE,EAAC,MAAM,EAAE,sCAA4B,CAAC,IAAI,EAAE,GAAG,IAAI,CAAC,gBAAgB,EAAC;QACvF,WAAW,EAAE,EAAC,OAAO,EAAE,oCAA0B,CAAC,IAAI,EAAE,GAAG,IAAI,CAAC,WAAW,EAAC;QAC5E,OAAO,EAAE,EAAC,OAAO,EAAE,qBAAC,CAAC,IAAI,CAAC,kBAAC,CAAC,IAAI,CAAC,EAAE,OAAO,EAAE,qBAAC,CAAC,IAAI,CAAC,kBAAC,CAAC,IAAI,CAAC,EAAE,GAAG,IAAI,CAAC,OAAO,EAAC;QAC5E,UAAU,EAAE;YACR,YAAY,EAAE,qBAAC,CAAC,IAAI,CAAC,kBAAC,CAAC,IAAI,CAAC;YAC5B,oBAAoB,EAAE,CAAC,IAAU,EAAE,MAAoB,EAAE,EAAE;gBACvD,MAAM,EAAC,KAAK,EAAE,QAAQ,EAAC,GAAG,IAAI,CAAC,kBAAkB,IAAI,EAAE,CAAC;gBAExD,MAAM,YAAY,GAAG;oBACjB,WAAW,EAAE,CAAC,IAAI,CAAC,IAAI;oBACvB,qBAAqB,EAAE,CAAC,IAAI,CAAC,IAAI,IAAI,MAAM,EAAE,IAAI,CAAC,IAAI,KAAK,gBAAQ,CAAC,GAAG;oBACvE,WAAW,EACP,CAAC,IAAI,CAAC,IAAI,IAAI,MAAM,EAAE,IAAI,CAAC,IAAI,KAAK,gBAAQ,CAAC,GAAG,IAAI,MAAM,CAAC,UAAU,KAAK,CAAC;iBAClF,CAAC;gBAEF,MAAM,eAAe,GAAG,YAAY,CAAC,QAAQ,IAAI,WAAW,CAAC,CAAC;gBAE9D,IAAI,CAAC,eAAe;oBAAE,OAAO,IAAI,CAAC;gBAElC,OAAO,OAAO,KAAK,KAAK,UAAU;oBAC9B,CAAC,CAAC,KAAK,EAAE;oBACT,CAAC,CAAC,CAAC,KAAK,IAAI,IAAA,kBAAe,EAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,kBAAkB,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC;YACrF,CAAC;YACD,iBAAiB,EAAE,IAAI,CAAC,iBAAiB;YACzC,GAAG,IAAI,CAAC,UAAU;SACrB;KACJ,CAAC;IACF,MAAM,iBAAiB,GAAoD;QACvE,GAAG,WAAW;QACd,gBAAgB,EAAE;YACd,MAAM,EAAE,sCAA4B,CAAC,UAAU;YAC/C,GAAG,IAAI,CAAC,gBAAgB;SAC3B;QACD,WAAW,EAAE,EAAC,OAAO,EAAE,oCAA0B,CAAC,UAAU,EAAE,GAAG,IAAI,CAAC,WAAW,EAAC;QAClF,MAAM,EAAE;YACJ,cAAc,EAAE,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM,CAAoB;YACpE,GAAG,IAAI,CAAC,MAAM;SACjB;QACD,IAAI,EAAE,EAAC,OAAO,EAAE,qBAAC,CAAC,IAAI,CAAC,kBAAC,CAAC,IAAI,CAAC,EAAE,GAAG,IAAI,CAAC,IAAI,EAAC;QAC7C,MAAM,EAAE,EAAC,SAAS,EAAE,qBAAC,CAAC,IAAI,CAAC,kBAAC,CAAC,MAAM,CAAC,EAAE,GAAG,IAAI,CAAC,MAAM,EAAC;QACrD,IAAI,EAAE,EAAC,OAAO,EAAE,qBAAC,CAAC,IAAI,CAAC,kBAAC,CAAC,IAAI,CAAC,EAAE,GAAG,IAAI,CAAC,IAAI,EAAC;QAC7C,SAAS,EAAE;YACP,YAAY,EAAE,qBAAC,CAAC,IAAI,CAAC,kBAAC,CAAC,SAAS,CAAC;YACjC,GAAG,IAAI,CAAC,SAAS;SACpB;QACD,UAAU,EAAE,EAAC,QAAQ,EAAE,qBAAC,CAAC,IAAI,CAAC,kBAAC,CAAC,KAAK,CAAC,EAAE,GAAG,IAAI,CAAC,UAAU,EAAC;QAC3D,IAAI,EAAE,EAAC,OAAO,EAAE,qBAAC,CAAC,IAAI,CAAC,kBAAC,CAAC,IAAI,CAAC,EAAE,GAAG,IAAI,CAAC,IAAI,EAAC;QAC7C,KAAK,EAAE;YACH,KAAK,EAAE,qBAAC,CAAC,IAAI,CAAC,kBAAC,CAAC,UAAU,CAAC;YAC3B,KAAK,EAAE,qBAAC,CAAC,IAAI,CAAC,kBAAC,CAAC,WAAW,CAAC;YAC5B,YAAY,EAAE,EAAC,IAAI,EAAE,KAAK,EAAC;YAC3B,GAAG,IAAI,CAAC,KAAK;SAChB;QACD,KAAK,EAAE;YACH,uBAAuB,EAAE,IAAI,CAAC,OAAO,EAAE,uBAAuB;SACjE;KACJ,CAAC;IACF,MAAM,cAAc,GAAiD;QACjE,GAAG,iBAAiB;QACpB,gBAAgB,EAAE,EAAC,MAAM,EAAE,sCAA4B,CAAC,OAAO,EAAE,GAAG,IAAI,CAAC,gBAAgB,EAAC;QAC1F,WAAW,EAAE,EAAC,OAAO,EAAE,oCAA0B,CAAC,OAAO,EAAE,GAAG,IAAI,CAAC,WAAW,EAAC;QAC/E,MAAM,EAAE,EAAC,SAAS,EAAE,qBAAC,CAAC,IAAI,CAAC,kBAAC,CAAC,MAAM,CAAC,EAAE,GAAG,IAAI,CAAC,MAAM,EAAC;KACxD,CAAC;IACF,MAAM,UAAU,GAA6C;QACzD,GAAG,cAAc;QACjB,UAAU,EAAE,EAAC,YAAY,EAAE,IAAI,CAAC,cAAc,EAAE,GAAG,IAAI,CAAC,UAAU,EAAC;QACnE,gBAAgB,EAAE,EAAC,MAAM,EAAE,sCAA4B,CAAC,GAAG,EAAE,GAAG,IAAI,CAAC,gBAAgB,EAAC;QACtF,WAAW,EAAE,EAAC,OAAO,EAAE,oCAA0B,CAAC,GAAG,EAAE,GAAG,IAAI,CAAC,WAAW,EAAC;QAC3E,SAAS,EAAE,EAAC,YAAY,EAAE,qBAAC,CAAC,IAAI,CAAC,kBAAC,CAAC,SAAS,CAAC,EAAE,GAAG,IAAI,CAAC,SAAS,EAAC;QACjE,OAAO,EAAE;YACL,kBAAkB,EAAE,IAAI,CAAC,iBAAiB;YAC1C,oCAAoC,EAAE,IAAI,CAAC,oCAAoC;YAC/E,6BAA6B,EAAE,IAAI,CAAC,6BAA6B;YACjE,GAAG,IAAI,CAAC,OAAO;SAClB;QACD,QAAQ,EAAE,EAAC,wBAAwB,EAAE,GAAG,EAAE,CAAC,IAAA,kBAAe,EAAC,UAAU,CAAC,EAAE,GAAG,IAAI,CAAC,QAAQ,EAAC;QACzF,OAAO,EAAE;YACL,sBAAsB,EAAE,GAAG,EAAE,CAAC,IAAA,kBAAe,EAAC,cAAc,CAAC;YAC7D,sBAAsB,EAAE,GAAG,EAAE,CAAC,IAAA,kBAAe,EAAC,cAAc,CAAC;SAChE;QACD,MAAM,EAAE;YACJ,SAAS,EAAE,qBAAC,CAAC,IAAI,CAAC,kBAAC,CAAC,GAAG,CAAC;YACxB,sBAAsB,EAAE,GAAG,EAAE,CAAC,IAAA,kBAAe,EAAC,WAAW,CAAC;YAC1D,wBAAwB,EAAE,GAAG,EAAE,CAAC,IAAA,kBAAe,EAAC,aAAa,CAAC;YAC9D,GAAG,IAAI,CAAC,MAAM;SACjB;QACD,OAAO,EAAE;YACL,UAAU,EAAE,qBAAC,CAAC,IAAI,CAAC,kBAAC,CAAC,IAAI,CAAC;YAC1B,uBAAuB,EAAE,GAAG,EAAE,CAAC,IAAA,kBAAe,EAAC,YAAY,CAAC;YAC5D,GAAG,IAAI,CAAC,OAAO;SAClB;QACD,QAAQ,EAAE;YACN,uBAAuB,EAAE,GAAG,EAAE,CAAC,IAAA,kBAAe,EAAC,YAAY,CAAC;YAC5D,GAAG,IAAI,CAAC,QAAQ;YAChB,QAAQ,EAAE,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC,QAAQ,EAAE,QAAQ;SAC1D;QACD,OAAO,EAAE;YACL,iBAAiB,EAAE,IAAI,CAAC,iBAAiB;YACzC,oCAAoC,EAAE,IAAI,CAAC,oCAAoC;YAC/E,GAAG,IAAI,CAAC,OAAO;SAClB;QACD,UAAU,EAAE;YACR,KAAK,EAAE,qBAAC,CAAC,IAAI,CAAC,kBAAC,CAAC,QAAQ,CAAC;YACzB,KAAK,EAAE,qBAAC,CAAC,IAAI,CAAC,kBAAC,CAAC,QAAQ,CAAC;YACzB,KAAK,EAAE,qBAAC,CAAC,IAAI,CAAC,kBAAC,CAAC,QAAQ,CAAC;YACzB,KAAK,EAAE,qBAAC,CAAC,IAAI,CAAC,kBAAC,CAAC,QAAQ,CAAC;YACzB,KAAK,EAAE,qBAAC,CAAC,IAAI,CAAC,kBAAC,CAAC,QAAQ,CAAC;YACzB,KAAK,EAAE,qBAAC,CAAC,IAAI,CAAC,kBAAC,CAAC,QAAQ,CAAC;YACzB,kBAAkB,EAAE,CAAC,IAAU,EAAE,EAAE,CAC/B,GAAG,IAAA,kBAAe,EAAC,SAAS,CAAC,IAAI,IAAI,CAAC,KAAK,CAAC,sBAAc,CAAC,KAAK,CAAC,EAAE,EAAE,4BAA4B;YACrG,GAAG,IAAI,CAAC,UAAU;SACrB;QACD,WAAW,EAAE;YACT,CAAC,mBAAW,CAAC,WAAW,CAAC,EAAE,GAAG,EAAE,CAAC,IAAA,kBAAe,EAAC,cAAc,CAAC;SACnE;KACJ,CAAC;IACF,MAAM,WAAW,GAA8C;QAC3D,GAAG,UAAU;QACb,gBAAgB,EAAE,EAAC,MAAM,EAAE,sCAA4B,CAAC,IAAI,EAAE,GAAG,IAAI,CAAC,gBAAgB,EAAC;QACvF,WAAW,EAAE,EAAC,OAAO,EAAE,oCAA0B,CAAC,IAAI,EAAE,GAAG,IAAI,CAAC,WAAW,EAAC;QAC5E,KAAK,EAAE,EAAC,IAAI,EAAE,iBAAS,EAAE,GAAG,IAAI,CAAC,KAAK,EAAC;KAC1C,CAAC;IAEF,MAAM,iBAAiB,GAAG,CAAC,kBAAC,CAAC,IAAI,EAAE,kBAAC,CAAC,IAAI,CAAC,CAAC;IAC3C,MAAM,uBAAuB,GAAG,iBAAiB,CAAC,MAAM,CACpD,kBAAC,CAAC,IAAI,EACN,kBAAC,CAAC,MAAM,EACR,kBAAC,CAAC,IAAI,EACN,kBAAC,CAAC,IAAI,EAEN,kBAAC,CAAC,IAAI,EACN,kBAAC,CAAC,QAAQ,EACV,kBAAC,CAAC,QAAQ,EACV,kBAAC,CAAC,QAAQ,EACV,kBAAC,CAAC,QAAQ,EACV,kBAAC,CAAC,QAAQ,EACV,kBAAC,CAAC,QAAQ,EAEV,kBAAC,CAAC,UAAU,EACZ,kBAAC,CAAC,WAAW,EAEb,kBAAC,CAAC,KAAK,EACP,kBAAC,CAAC,SAAS,CACd,CAAC;IACF,MAAM,oBAAoB,GAAG,uBAAuB,CAAC,MAAM,CAAC,kBAAC,CAAC,MAAM,CAAC,CAAC;IACtE,MAAM,gBAAgB,GAAG,oBAAoB,CAAC,MAAM,CAChD,kBAAC,CAAC,SAAS,EAEX,kBAAC,CAAC,IAAI,EACN,kBAAC,CAAC,GAAG,CACR,CAAC;IACF,MAAM,iBAAiB,GAAG,gBAAgB,CAAC,MAAM,EAAE,CAAC;IAEpD,IAAI,aAAa,CAAC;IAElB,QAAQ,IAAI,CAAC,MAAM,EAAE,CAAC;QAClB,KAAK,MAAM,CAAC,CAAC,CAAC;YACV,aAAa,GAAG,iBAAiB,CAAC;YAClC,OAAO,CAAC,GAAG,CAAC,yBAAc,EAAE,WAAW,CAAC,CAAC,GAAG,CAAC,iBAAU,EAAE,WAAW,CAAC,CAAC;YACtE,MAAM;QACV,CAAC;QACD,KAAK,YAAY,CAAC,CAAC,CAAC;YAChB,aAAa,GAAG,uBAAuB,CAAC;YACxC,OAAO,CAAC,GAAG,CAAC,yBAAc,EAAE,iBAAiB,CAAC,CAAC,GAAG,CAAC,6BAAgB,EAAE,iBAAiB,CAAC,CAAC;YACxF,MAAM;QACV,CAAC;QACD,KAAK,SAAS,CAAC,CAAC,CAAC;YACb,aAAa,GAAG,oBAAoB,CAAC;YACrC,OAAO,CAAC,GAAG,CAAC,yBAAc,EAAE,cAAc,CAAC,CAAC,GAAG,CAAC,uBAAa,EAAE,cAAc,CAAC,CAAC;YAC/E,MAAM;QACV,CAAC;QACD,KAAK,KAAK,CAAC,CAAC,CAAC;YACT,aAAa,GAAG,gBAAgB,CAAC;YACjC,OAAO,CAAC,GAAG,CAAC,yBAAc,EAAE,UAAU,CAAC,CAAC,GAAG,CAAC,eAAS,EAAE,UAAU,CAAC,CAAC;YACnE,MAAM;QACV,CAAC;QACD,OAAO,CAAC,CAAC,CAAC;YACN,aAAa,GAAG,iBAAiB,CAAC;YAClC,OAAO,CAAC,GAAG,CAAC,yBAAc,EAAE,WAAW,CAAC,CAAC,GAAG,CAAC,iBAAU,EAAE,WAAW,CAAC,CAAC;YACtE,MAAM;QACV,CAAC;IACL,CAAC;IAED,MAAM,cAAc,GAAG,IAAI,CAAC,cAAc,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC;IAC1D,cAAc,CAAC,IAAI,CAAC,GAAG,oBAAoB,CAAC,CAAC;IAC7C,KAAK,MAAM,MAAM,IAAI,aAAa,EAAE,CAAC;QACjC,MAAM,GAAG,GAAG,qBAAC,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;QAC3B,IAAI,GAAG;YAAE,cAAc,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IACtC,CAAC;IAED,OAAO,CAAC,GAAG,CAAC,mCAAgB,EAAE;QAC1B,QAAQ,EAAE,IAAI,CAAC,QAAQ;QACvB,QAAQ,EAAE,IAAI,CAAC,QAAQ;QACvB,cAAc;KACjB,CAAC,CAAC;AACP,CAAC,CAAC;AAzNW,QAAA,YAAY,gBAyNvB","sourcesContent":["import type {Node} from 'prosemirror-model';\n\nimport type {ExtensionAuto} from '../core';\nimport {BehaviorPreset, type BehaviorPresetOptions} from '../extensions/behavior';\nimport {\n EditorModeKeymap,\n type EditorModeKeymapOptions,\n} from '../extensions/behavior/EditorModeKeymap';\nimport {BaseNode, YfmHeadingAttr, YfmNoteNode} from '../extensions/specs';\nimport {i18n as i18nPlaceholder} from '../i18n/placeholder';\nimport {CommonMarkPreset, type CommonMarkPresetOptions} from '../presets/commonmark';\nimport {DefaultPreset, type DefaultPresetOptions} from '../presets/default';\nimport {FullPreset, type FullPresetOptions} from '../presets/full';\nimport {YfmPreset, type YfmPresetOptions} from '../presets/yfm';\nimport {ZeroPreset, type ZeroPresetOptions} from '../presets/zero';\nimport {Action as A, formatter as f} from '../shortcuts';\nimport type {DirectiveSyntaxContext} from '../utils/directive';\nimport type {FileUploadHandler} from '../utils/upload';\n\nimport {wCommandMenuConfigByPreset, wSelectionMenuConfigByPreset} from './config/wysiwyg';\nimport {emojiDefs} from './emoji';\nimport type {MarkdownEditorPreset, WysiwygPlaceholderOptions} from './types';\n\nconst DEFAULT_IGNORED_KEYS = ['Tab', 'Shift-Tab'] as const;\n\nexport type ExtensionsOptions = BehaviorPresetOptions & FullPresetOptions;\n\nexport type BundlePresetOptions = ExtensionsOptions &\n EditorModeKeymapOptions & {\n preset: MarkdownEditorPreset;\n mdBreaks?: boolean;\n preserveEmptyRows?: boolean;\n fileUploadHandler?: FileUploadHandler;\n placeholderOptions?: WysiwygPlaceholderOptions;\n /**\n * If we need to set dimensions for uploaded images\n * @default false\n */\n needToSetDimensionsForUploadedImages?: boolean;\n enableNewImageSizeCalculation?: boolean;\n directiveSyntax: DirectiveSyntaxContext;\n // MAJOR: remove markdown-it-attrs\n disableMdAttrs?: boolean;\n mobile?: boolean;\n searchPanel: boolean;\n };\n\ndeclare global {\n namespace WysiwygEditor {\n interface Context {\n directiveSyntax: DirectiveSyntaxContext;\n }\n }\n}\n\nexport const BundlePreset: ExtensionAuto<BundlePresetOptions> = (builder, opts) => {\n builder.context.set('directiveSyntax', opts.directiveSyntax);\n\n const dropCursor: NonNullable<BundlePresetOptions['cursor']>['dropOptions'] = {\n color: 'var(--g-color-line-brand)',\n width: 2,\n };\n\n const zeroOptions: BehaviorPresetOptions & ZeroPresetOptions = {\n ...opts,\n baseStyles: {\n attributes: {\n // for disable setting attrs inside pm-view from floating-ui from uikit\n // see https://github.com/floating-ui/floating-ui/discussions/3213\n // and https://github.com/floating-ui/floating-ui/pull/3202\n 'aria-live': '',\n ...opts.baseStyles?.attributes,\n },\n },\n cursor: {dropOptions: dropCursor},\n search: opts.searchPanel ? {anchorSelector: '.g-md-search-wysiwyg-anchor'} : undefined,\n clipboard: {pasteFileHandler: opts.fileUploadHandler, ...opts.clipboard},\n selectionContext: {config: wSelectionMenuConfigByPreset.zero, ...opts.selectionContext},\n commandMenu: {actions: wCommandMenuConfigByPreset.zero, ...opts.commandMenu},\n history: {undoKey: f.toPM(A.Undo), redoKey: f.toPM(A.Redo), ...opts.history},\n baseSchema: {\n paragraphKey: f.toPM(A.Text),\n paragraphPlaceholder: (node: Node, parent?: Node | null) => {\n const {value, behavior} = opts.placeholderOptions || {};\n\n const emptyEntries = {\n 'empty-row': !node.text,\n 'empty-row-top-level': !node.text && parent?.type.name === BaseNode.Doc,\n 'empty-doc':\n !node.text && parent?.type.name === BaseNode.Doc && parent.childCount === 1,\n };\n\n const showPlaceholder = emptyEntries[behavior || 'empty-doc'];\n\n if (!showPlaceholder) return null;\n\n return typeof value === 'function'\n ? value()\n : (value ?? i18nPlaceholder(opts.mobile ? 'doc_empty_mobile' : 'doc_empty'));\n },\n preserveEmptyRows: opts.preserveEmptyRows,\n ...opts.baseSchema,\n },\n };\n const commonMarkOptions: BehaviorPresetOptions & CommonMarkPresetOptions = {\n ...zeroOptions,\n selectionContext: {\n config: wSelectionMenuConfigByPreset.commonmark,\n ...opts.selectionContext,\n },\n commandMenu: {actions: wCommandMenuConfigByPreset.commonmark, ...opts.commandMenu},\n breaks: {\n preferredBreak: (opts.mdBreaks ? 'soft' : 'hard') as 'soft' | 'hard',\n ...opts.breaks,\n },\n bold: {boldKey: f.toPM(A.Bold), ...opts.bold},\n italic: {italicKey: f.toPM(A.Italic), ...opts.italic},\n code: {codeKey: f.toPM(A.Code), ...opts.code},\n codeBlock: {\n codeBlockKey: f.toPM(A.CodeBlock),\n ...opts.codeBlock,\n },\n blockquote: {qouteKey: f.toPM(A.Quote), ...opts.blockquote},\n link: {linkKey: f.toPM(A.Link), ...opts.link},\n lists: {\n ulKey: f.toPM(A.BulletList),\n olKey: f.toPM(A.OrderedList),\n ulInputRules: {plus: false},\n ...opts.lists,\n },\n image: {\n parseInsertedUrlAsImage: opts.imgSize?.parseInsertedUrlAsImage,\n },\n };\n const defaultOptions: BehaviorPresetOptions & DefaultPresetOptions = {\n ...commonMarkOptions,\n selectionContext: {config: wSelectionMenuConfigByPreset.default, ...opts.selectionContext},\n commandMenu: {actions: wCommandMenuConfigByPreset.default, ...opts.commandMenu},\n strike: {strikeKey: f.toPM(A.Strike), ...opts.strike},\n };\n const yfmOptions: BehaviorPresetOptions & YfmPresetOptions = {\n ...defaultOptions,\n yfmConfigs: {disableAttrs: opts.disableMdAttrs, ...opts.yfmConfigs},\n selectionContext: {config: wSelectionMenuConfigByPreset.yfm, ...opts.selectionContext},\n commandMenu: {actions: wCommandMenuConfigByPreset.yfm, ...opts.commandMenu},\n underline: {underlineKey: f.toPM(A.Underline), ...opts.underline},\n imgSize: {\n imageUploadHandler: opts.fileUploadHandler,\n needToSetDimensionsForUploadedImages: opts.needToSetDimensionsForUploadedImages,\n enableNewImageSizeCalculation: opts.enableNewImageSizeCalculation,\n ...opts.imgSize,\n },\n checkbox: {checkboxLabelPlaceholder: () => i18nPlaceholder('checkbox'), ...opts.checkbox},\n deflist: {\n deflistTermPlaceholder: () => i18nPlaceholder('deflist_term'),\n deflistDescPlaceholder: () => i18nPlaceholder('deflist_desc'),\n },\n yfmCut: {\n yfmCutKey: f.toPM(A.Cut),\n yfmCutTitlePlaceholder: () => i18nPlaceholder('cut_title'),\n yfmCutContentPlaceholder: () => i18nPlaceholder('cut_content'),\n ...opts.yfmCut,\n },\n yfmNote: {\n yfmNoteKey: f.toPM(A.Note),\n yfmNoteTitlePlaceholder: () => i18nPlaceholder('note_title'),\n ...opts.yfmNote,\n },\n yfmTable: {\n yfmTableCellPlaceholder: () => i18nPlaceholder('table_cell'),\n ...opts.yfmTable,\n controls: opts.mobile ? false : opts.yfmTable?.controls,\n },\n yfmFile: {\n fileUploadHandler: opts.fileUploadHandler,\n needToSetDimensionsForUploadedImages: opts.needToSetDimensionsForUploadedImages,\n ...opts.yfmFile,\n },\n yfmHeading: {\n h1Key: f.toPM(A.Heading1),\n h2Key: f.toPM(A.Heading2),\n h3Key: f.toPM(A.Heading3),\n h4Key: f.toPM(A.Heading4),\n h5Key: f.toPM(A.Heading5),\n h6Key: f.toPM(A.Heading6),\n headingPlaceholder: (node: Node) =>\n `${i18nPlaceholder('heading')} ${node.attrs[YfmHeadingAttr.Level]}`, // todo: remove attrs import\n ...opts.yfmHeading,\n },\n placeholder: {\n [YfmNoteNode.NoteContent]: () => i18nPlaceholder('note_content'),\n },\n };\n const fullOptions: BehaviorPresetOptions & FullPresetOptions = {\n ...yfmOptions,\n selectionContext: {config: wSelectionMenuConfigByPreset.full, ...opts.selectionContext},\n commandMenu: {actions: wCommandMenuConfigByPreset.full, ...opts.commandMenu},\n emoji: {defs: emojiDefs, ...opts.emoji},\n };\n\n const zeroIgnoreActions = [A.Undo, A.Redo];\n const commonMarkIgnoreActions = zeroIgnoreActions.concat(\n A.Bold,\n A.Italic,\n A.Code,\n A.Link,\n\n A.Text,\n A.Heading1,\n A.Heading2,\n A.Heading3,\n A.Heading4,\n A.Heading5,\n A.Heading6,\n\n A.BulletList,\n A.OrderedList,\n\n A.Quote,\n A.CodeBlock,\n );\n const defaultIgnoreActions = commonMarkIgnoreActions.concat(A.Strike);\n const yfmIgnoreActions = defaultIgnoreActions.concat(\n A.Underline,\n\n A.Note,\n A.Cut,\n );\n const fullIgnoreActions = yfmIgnoreActions.concat();\n\n let ignoreActions;\n\n switch (opts.preset) {\n case 'zero': {\n ignoreActions = zeroIgnoreActions;\n builder.use(BehaviorPreset, zeroOptions).use(ZeroPreset, zeroOptions);\n break;\n }\n case 'commonmark': {\n ignoreActions = commonMarkIgnoreActions;\n builder.use(BehaviorPreset, commonMarkOptions).use(CommonMarkPreset, commonMarkOptions);\n break;\n }\n case 'default': {\n ignoreActions = defaultIgnoreActions;\n builder.use(BehaviorPreset, defaultOptions).use(DefaultPreset, defaultOptions);\n break;\n }\n case 'yfm': {\n ignoreActions = yfmIgnoreActions;\n builder.use(BehaviorPreset, yfmOptions).use(YfmPreset, yfmOptions);\n break;\n }\n default: {\n ignoreActions = fullIgnoreActions;\n builder.use(BehaviorPreset, fullOptions).use(FullPreset, fullOptions);\n break;\n }\n }\n\n const ignoreKeysList = opts.ignoreKeysList?.slice() ?? [];\n ignoreKeysList.push(...DEFAULT_IGNORED_KEYS);\n for (const action of ignoreActions) {\n const key = f.toPM(action);\n if (key) ignoreKeysList.push(key);\n }\n\n builder.use(EditorModeKeymap, {\n onSubmit: opts.onSubmit,\n onCancel: opts.onCancel,\n ignoreKeysList,\n });\n};\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"Editor.js","sourceRoot":"../../../src","sources":["core/Editor.ts"],"names":[],"mappings":"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","sourcesContent":["import type {PresetName} from 'markdown-it';\nimport {EditorState} from 'prosemirror-state';\nimport {EditorView} from 'prosemirror-view';\n\nimport type {CommonEditor, ContentHandler, MarkupString} from '../common';\nimport {Logger2} from '../logger';\n\nimport type {ActionsManager} from './ActionsManager';\nimport {WysiwygContentHandler} from './ContentHandler';\nimport {ExtensionsManager} from './ExtensionsManager';\nimport {SchemaDynamicModifier} from './SchemaDynamicModifier';\nimport {MarkdownParserDynamicModifier} from './markdown/MarkdownParser';\nimport {MarkdownSerializerDynamicModifier} from './markdown/MarkdownSerializerDynamicModifier';\nimport type {TransformFn} from './markdown/ProseMirrorTransformer';\nimport type {ActionStorage} from './types/actions';\nimport type {DynamicModifiers} from './types/dynamicModifiers';\nimport type {Extension} from './types/extension';\nimport type {Parser} from './types/parser';\nimport type {Serializer} from './types/serializer';\nimport {bindActions} from './utils/actions';\nimport {convertDynamicModifiersConfigs} from './utils/dynamicModifiers';\nimport {LoggerFacet} from './utils/logger';\nimport {logTransactionMetrics} from './utils/metrics';\n\ntype OnChange = (editor: WysiwygEditor) => void;\n\nexport type EscapeConfig = {\n commonEscape?: RegExp;\n startOfLineEscape?: RegExp;\n};\n\nexport type WysiwygEditorOptions = {\n domElem?: Element;\n /** markdown markup */\n initialContent?: string;\n extensions?: Extension;\n /** @default 'default' */\n mdPreset?: PresetName;\n allowHTML?: boolean;\n linkify?: boolean;\n pmTransformers?: TransformFn[];\n linkifyTlds?: string | string[];\n escapeConfig?: EscapeConfig;\n /** Call on any state change (move cursor, change selection, etc...) */\n onChange?: OnChange;\n /** Call only if document change */\n onDocChange?: OnChange;\n /** @internal Modifiers adjust the parser and serializer */\n modifiers?: DynamicModifiers[];\n logger?: Logger2.ILogger;\n};\n\nexport class WysiwygEditor implements CommonEditor, ActionStorage {\n #view: EditorView;\n #serializer: Serializer;\n #parser: Parser;\n #actions: ActionsManager;\n #contentHandler: ContentHandler;\n #escapeConfig?: EscapeConfig;\n\n get dom() {\n return this.#view.dom;\n }\n\n get serializer() {\n return this.#serializer;\n }\n\n get parser() {\n return this.#parser;\n }\n\n get actions() {\n return this.#actions.actions;\n }\n\n /** @internal used for prosemirror-dev-tools in demo */\n get view() {\n return this.#view;\n }\n\n constructor({\n domElem,\n initialContent = '',\n extensions = () => {},\n allowHTML,\n mdPreset,\n linkify,\n pmTransformers,\n linkifyTlds,\n escapeConfig,\n onChange,\n onDocChange,\n modifiers,\n logger = new Logger2(),\n }: WysiwygEditorOptions) {\n const dynamicModifiersConfig = modifiers\n ? convertDynamicModifiersConfigs(modifiers)\n : undefined;\n const dynamicModifiers = dynamicModifiersConfig\n ? {\n schema: new SchemaDynamicModifier(dynamicModifiersConfig.schema),\n parser: new MarkdownParserDynamicModifier(dynamicModifiersConfig.parser),\n serializer: new MarkdownSerializerDynamicModifier(\n dynamicModifiersConfig.serializer,\n ),\n }\n : undefined;\n\n const {\n schema,\n markupParser: parser,\n serializer,\n nodeViews,\n markViews,\n plugins,\n rawActions,\n actions,\n } = ExtensionsManager.process(\n extensions,\n {\n // \"breaks\" option only affects the renderer, but not the parser\n mdOpts: {html: allowHTML, linkify, breaks: true, preset: mdPreset},\n linkifyTlds,\n pmTransformers,\n dynamicModifiers,\n },\n logger,\n );\n\n plugins.unshift(LoggerFacet.of(logger));\n\n const state = EditorState.create({\n schema,\n doc: parser.parse(initialContent),\n plugins,\n });\n\n const thisOnChange = () => this.tryOnChange(onChange);\n const thisOnDocChange = () => this.tryOnChange(onDocChange);\n\n this.#view = new EditorView(domElem ?? null, {\n state,\n nodeViews,\n markViews,\n dispatchTransaction(tr) {\n const newState = this.state.apply(tr);\n // @ts-expect-error\n this.updateState(newState);\n thisOnChange();\n if (tr.docChanged) {\n thisOnDocChange();\n }\n logTransactionMetrics(tr, logger);\n },\n });\n this.#actions = actions.setActions(\n bindActions<keyof WysiwygEditor.Actions>(rawActions)(\n this.#view,\n ) as WysiwygEditor.Actions,\n );\n this.#serializer = serializer;\n this.#parser = parser;\n this.#contentHandler = new WysiwygContentHandler(this.#view, parser);\n this.#escapeConfig = escapeConfig;\n }\n\n action<T extends keyof WysiwygEditor.Actions>(actionName: T): WysiwygEditor.Actions[T] {\n return this.#actions.action(actionName);\n }\n\n focus() {\n return this.#view.focus();\n }\n\n hasFocus() {\n return this.#view.hasFocus();\n }\n\n getValue(): MarkupString {\n return this.#serializer.serialize(this.#view.state.doc, this.#escapeConfig);\n }\n\n isEmpty(): boolean {\n const {doc} = this.#view.state;\n return (\n doc.childCount === 1 &&\n doc.firstChild?.type.name === 'paragraph' &&\n doc.firstChild.childCount === 0\n );\n }\n\n clear(): void {\n return this.#contentHandler.clear();\n }\n\n replace(newMarkup: MarkupString): void {\n return this.#contentHandler.replace(newMarkup);\n }\n\n prepend(markup: MarkupString): void {\n return this.#contentHandler.prepend(markup);\n }\n\n append(markup: MarkupString): void {\n return this.#contentHandler.append(markup);\n }\n\n moveCursor(position: 'start' | 'end'): void {\n return this.#contentHandler.moveCursor(position);\n }\n\n destroy() {\n this.#view.destroy();\n }\n\n private tryOnChange(cb?: OnChange) {\n if (cb) {\n try {\n cb(this);\n } catch (err) {\n console.error(err);\n }\n }\n }\n}\n\ndeclare global {\n namespace WysiwygEditor {\n // eslint-disable-next-line @typescript-eslint/no-empty-interface\n interface Actions {}\n }\n}\n"]}
1
+ {"version":3,"file":"Editor.js","sourceRoot":"../../../src","sources":["core/Editor.ts"],"names":[],"mappings":"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","sourcesContent":["import type {PresetName} from 'markdown-it';\nimport {EditorState} from 'prosemirror-state';\nimport {EditorView} from 'prosemirror-view';\n\nimport type {CommonEditor, ContentHandler, MarkupString} from '../common';\nimport {Logger2} from '../logger';\n\nimport type {ActionsManager} from './ActionsManager';\nimport {WysiwygContentHandler} from './ContentHandler';\nimport {ExtensionsManager} from './ExtensionsManager';\nimport {SchemaDynamicModifier} from './SchemaDynamicModifier';\nimport {MarkdownParserDynamicModifier} from './markdown/MarkdownParser';\nimport {MarkdownSerializerDynamicModifier} from './markdown/MarkdownSerializerDynamicModifier';\nimport type {TransformFn} from './markdown/ProseMirrorTransformer';\nimport type {ActionStorage} from './types/actions';\nimport type {DynamicModifiers} from './types/dynamicModifiers';\nimport type {Extension} from './types/extension';\nimport type {Parser} from './types/parser';\nimport type {Serializer} from './types/serializer';\nimport {bindActions} from './utils/actions';\nimport {convertDynamicModifiersConfigs} from './utils/dynamicModifiers';\nimport {LoggerFacet} from './utils/logger';\nimport {logTransactionMetrics} from './utils/metrics';\n\ntype OnChange = (editor: WysiwygEditor) => void;\n\nexport type EscapeConfig = {\n commonEscape?: RegExp;\n startOfLineEscape?: RegExp;\n};\n\nexport type WysiwygEditorOptions = {\n domElem?: Element;\n /** markdown markup */\n initialContent?: string;\n extensions?: Extension;\n /** @default 'default' */\n mdPreset?: PresetName;\n allowHTML?: boolean;\n linkify?: boolean;\n pmTransformers?: TransformFn[];\n linkifyTlds?: string | string[];\n escapeConfig?: EscapeConfig;\n /** Call on any state change (move cursor, change selection, etc...) */\n onChange?: OnChange;\n /** Call only if document change */\n onDocChange?: OnChange;\n /** @internal Modifiers adjust the parser and serializer */\n modifiers?: DynamicModifiers[];\n logger?: Logger2.ILogger;\n};\n\nexport class WysiwygEditor implements CommonEditor, ActionStorage {\n #view: EditorView;\n #serializer: Serializer;\n #parser: Parser;\n #actions: ActionsManager;\n #contentHandler: ContentHandler;\n #escapeConfig?: EscapeConfig;\n\n get dom() {\n return this.#view.dom;\n }\n\n get serializer() {\n return this.#serializer;\n }\n\n get parser() {\n return this.#parser;\n }\n\n get actions() {\n return this.#actions.actions;\n }\n\n /** @internal used for prosemirror-dev-tools in demo */\n get view() {\n return this.#view;\n }\n\n constructor({\n domElem,\n initialContent = '',\n extensions = () => {},\n allowHTML,\n mdPreset,\n linkify,\n pmTransformers,\n linkifyTlds,\n escapeConfig,\n onChange,\n onDocChange,\n modifiers,\n logger = new Logger2(),\n }: WysiwygEditorOptions) {\n const dynamicModifiersConfig = modifiers\n ? convertDynamicModifiersConfigs(modifiers)\n : undefined;\n const dynamicModifiers = dynamicModifiersConfig\n ? {\n schema: new SchemaDynamicModifier(dynamicModifiersConfig.schema),\n parser: new MarkdownParserDynamicModifier(dynamicModifiersConfig.parser),\n serializer: new MarkdownSerializerDynamicModifier(\n dynamicModifiersConfig.serializer,\n ),\n }\n : undefined;\n\n const {\n schema,\n markupParser: parser,\n serializer,\n nodeViews,\n markViews,\n plugins,\n rawActions,\n actions,\n } = ExtensionsManager.process(\n extensions,\n {\n // \"breaks\" option only affects the renderer, but not the parser\n mdOpts: {html: allowHTML, linkify, breaks: true, preset: mdPreset},\n linkifyTlds,\n pmTransformers,\n dynamicModifiers,\n },\n logger,\n );\n\n plugins.unshift(LoggerFacet.of(logger));\n\n const state = EditorState.create({\n schema,\n doc: parser.parse(initialContent),\n plugins,\n });\n\n const thisOnChange = () => this.tryOnChange(onChange);\n const thisOnDocChange = () => this.tryOnChange(onDocChange);\n\n this.#view = new EditorView(domElem ?? null, {\n state,\n nodeViews,\n markViews,\n dispatchTransaction(tr) {\n const newState = this.state.apply(tr);\n // @ts-expect-error\n this.updateState(newState);\n thisOnChange();\n if (tr.docChanged) {\n thisOnDocChange();\n }\n logTransactionMetrics(tr, logger);\n },\n });\n this.#actions = actions.setActions(\n bindActions<keyof WysiwygEditor.Actions>(rawActions)(\n this.#view,\n ) as WysiwygEditor.Actions,\n );\n this.#serializer = serializer;\n this.#parser = parser;\n this.#contentHandler = new WysiwygContentHandler(this.#view, parser);\n this.#escapeConfig = escapeConfig;\n }\n\n action<T extends keyof WysiwygEditor.Actions>(actionName: T): WysiwygEditor.Actions[T] {\n return this.#actions.action(actionName);\n }\n\n focus() {\n return this.#view.focus();\n }\n\n hasFocus() {\n return this.#view.hasFocus();\n }\n\n getValue(): MarkupString {\n return this.#serializer.serialize(this.#view.state.doc, this.#escapeConfig);\n }\n\n isEmpty(): boolean {\n const {doc} = this.#view.state;\n return (\n doc.childCount === 1 &&\n doc.firstChild?.type.name === 'paragraph' &&\n doc.firstChild.childCount === 0\n );\n }\n\n clear(): void {\n return this.#contentHandler.clear();\n }\n\n replace(newMarkup: MarkupString): void {\n return this.#contentHandler.replace(newMarkup);\n }\n\n prepend(markup: MarkupString): void {\n return this.#contentHandler.prepend(markup);\n }\n\n append(markup: MarkupString): void {\n return this.#contentHandler.append(markup);\n }\n\n moveCursor(position: 'start' | 'end'): void {\n return this.#contentHandler.moveCursor(position);\n }\n\n destroy() {\n this.#view.destroy();\n }\n\n private tryOnChange(cb?: OnChange) {\n if (cb) {\n try {\n cb(this);\n } catch (err) {\n console.error(err);\n }\n }\n }\n}\n\ndeclare global {\n namespace WysiwygEditor {\n interface Actions {}\n }\n}\n"]}
@@ -9,13 +9,11 @@ type InputRulesConfig = Parameters<typeof inputRules>[0];
9
9
  type ConfigureMdParams = {
10
10
  /**
11
11
  * Apply this configurtion to text parser
12
- *
13
12
  * @default true
14
13
  */
15
14
  text?: boolean;
16
15
  /**
17
16
  * Apply this configurtion to markup parser
18
- *
19
17
  * @default true
20
18
  */
21
19
  markup?: boolean;
@@ -2,7 +2,7 @@
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.ExtensionBuilder = void 0;
4
4
  const tslib_1 = require("tslib");
5
- const orderedmap_1 = tslib_1.__importDefault(require("orderedmap")); // eslint-disable-line import/no-extraneous-dependencies
5
+ const orderedmap_1 = tslib_1.__importDefault(require("orderedmap"));
6
6
  const prosemirror_inputrules_1 = require("prosemirror-inputrules");
7
7
  const prosemirror_keymap_1 = require("prosemirror-keymap");
8
8
  var Priority;
@@ -1 +1 @@
1
- {"version":3,"file":"ExtensionBuilder.js","sourceRoot":"../../../src","sources":["core/ExtensionBuilder.ts"],"names":[],"mappings":"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","sourcesContent":["import type MarkdownIt from 'markdown-it';\nimport OrderedMap from 'orderedmap'; // eslint-disable-line import/no-extraneous-dependencies\nimport {inputRules} from 'prosemirror-inputrules';\nimport {keymap} from 'prosemirror-keymap';\nimport type {Plugin} from 'prosemirror-state';\n\nimport type {Logger2} from '../logger';\n\nimport type {ActionSpec} from './types/actions';\nimport type {\n Extension,\n ExtensionDeps,\n ExtensionMarkSpec,\n ExtensionNodeSpec,\n ExtensionSpec,\n ExtensionWithOptions,\n} from './types/extension';\nimport type {Keymap} from './types/keymap';\n\ntype InputRulesConfig = Parameters<typeof inputRules>[0];\ntype ExtensionWithParams = (builder: ExtensionBuilder, ...params: any[]) => void;\ntype ConfigureMdParams = {\n /**\n * Apply this configurtion to text parser\n *\n * @default true\n */\n text?: boolean;\n /**\n * Apply this configurtion to markup parser\n *\n * @default true\n */\n markup?: boolean;\n};\n\ntype ConfigureMdCallback = (md: MarkdownIt) => MarkdownIt;\ntype AddPmNodeCallback = () => ExtensionNodeSpec;\ntype AddPmMarkCallback = () => ExtensionMarkSpec;\ntype AddPmPluginCallback = (deps: ExtensionDeps) => Plugin | Plugin[];\ntype AddPmKeymapCallback = (deps: ExtensionDeps) => Keymap;\ntype AddPmInputRulesCallback = (deps: ExtensionDeps) => InputRulesConfig;\ntype AddActionCallback = (deps: ExtensionDeps) => ActionSpec;\n\nenum Priority {\n Highest = 1_000_000,\n VeryHigh = 100_000,\n High = 10_000,\n Medium = 1_000,\n Low = 100,\n VeryLow = 10,\n Lowest = 0,\n}\n\nconst DEFAULT_PRIORITY = Priority.Medium;\n\ntype BuilderContext<T extends object> = {\n has(key: keyof T): boolean;\n get<K extends keyof T>(key: K): T[K] | undefined;\n set<K extends keyof T>(key: K, value: T[K]): BuilderContext<T>;\n};\n\ndeclare global {\n namespace WysiwygEditor {\n interface Context {}\n }\n}\n\nexport class ExtensionBuilder {\n static createContext(): BuilderContext<WysiwygEditor.Context> {\n return new Map();\n }\n\n /* eslint-disable @typescript-eslint/member-ordering */\n static readonly Priority = Priority;\n readonly Priority = ExtensionBuilder.Priority;\n /* eslint-enable @typescript-eslint/member-ordering */\n\n readonly #logger: Logger2.ILogger;\n #confMdCbs: {cb: ConfigureMdCallback; params: Required<ConfigureMdParams>}[] = [];\n #nodeSpecs: Record<string, {name: string; cb: AddPmNodeCallback}> = {};\n #markSpecs: Record<string, {name: string; cb: AddPmMarkCallback; priority: number}> = {};\n #plugins: {cb: AddPmPluginCallback; priority: number}[] = [];\n #actions: [string, AddActionCallback][] = [];\n\n readonly context: BuilderContext<WysiwygEditor.Context>;\n\n constructor(logger: Logger2.ILogger, context?: BuilderContext<WysiwygEditor.Context>) {\n this.#logger = logger;\n this.context = context ?? ExtensionBuilder.createContext();\n }\n\n get logger(): Logger2.ILogger {\n return this.#logger;\n }\n\n use(extension: Extension): this;\n use<T>(extension: ExtensionWithOptions<T>, options: T): this;\n use(extension: ExtensionWithParams, ...params: any[]): this {\n extension(this, ...params);\n return this;\n }\n\n configureMd(cb: ConfigureMdCallback, params: ConfigureMdParams = {}): this {\n this.#confMdCbs.push({\n cb,\n params: {\n text: params.text ?? true,\n markup: params.markup ?? true,\n },\n });\n return this;\n }\n\n addNode(name: string, cb: AddPmNodeCallback): this {\n if (this.#nodeSpecs[name]) {\n throw new Error(`ProseMirror node with this name \"${name}\" already exist`);\n }\n this.#nodeSpecs[name] = {name, cb};\n return this;\n }\n\n addMark(name: string, cb: AddPmMarkCallback, priority = DEFAULT_PRIORITY): this {\n if (this.#markSpecs[name]) {\n throw new Error(`ProseMirror mark with this name \"${name}\" already exist`);\n }\n this.#markSpecs[name] = {name, cb, priority};\n return this;\n }\n\n addPlugin(cb: AddPmPluginCallback, priority = DEFAULT_PRIORITY): this {\n this.#plugins.push({cb, priority});\n return this;\n }\n\n addKeymap(cb: AddPmKeymapCallback, priority = DEFAULT_PRIORITY): this {\n this.#plugins.push({cb: (...args) => keymap(cb(...args)), priority});\n return this;\n }\n\n addInputRules(cb: AddPmInputRulesCallback, priority = DEFAULT_PRIORITY): this {\n this.#plugins.push({cb: (...args) => inputRules(cb(...args)), priority});\n return this;\n }\n\n addAction(name: string, cb: AddActionCallback): this {\n if (this.#actions.some(([actionName]) => actionName === name)) {\n throw new Error(\n `[Markdown Wysiwyg Editor] action with this name \"${name}\" already exist`,\n );\n }\n this.#actions.push([name, cb]);\n return this;\n }\n\n build(): ExtensionSpec {\n const confMd = this.#confMdCbs.slice();\n const nodes = {...this.#nodeSpecs};\n const marks = {...this.#markSpecs};\n const plugins = this.#plugins.slice();\n const actions = this.#actions.slice();\n\n return {\n configureMd: (md, parserType) =>\n confMd.reduce((pMd, {cb, params}) => {\n if (parserType === 'text' && params.text) {\n return cb(pMd);\n }\n if (parserType === 'markup' && params.markup) {\n return cb(pMd);\n }\n return pMd;\n }, md),\n nodes: () => {\n let map = OrderedMap.from<ExtensionNodeSpec>({});\n for (const {name, cb} of Object.values(nodes)) {\n map = map.addToEnd(name, cb());\n }\n return map;\n },\n marks: () => {\n // The order of marks in schema is important when serializing pm-document to DOM or markup\n // https://discuss.prosemirror.net/t/marks-priority/4463\n const sortedMarks = Object.values(marks).sort((a, b) => b.priority - a.priority);\n let map = OrderedMap.from<ExtensionMarkSpec>({});\n for (const {name, cb} of sortedMarks) {\n map = map.addToEnd(name, cb());\n }\n return map;\n },\n plugins: (deps) => {\n return plugins\n .sort((a, b) => b.priority - a.priority)\n .reduce<Plugin[]>((acc, {cb}) => {\n const res = cb(deps);\n if (Array.isArray(res)) acc.push(...res);\n else acc.push(res);\n return acc;\n }, []);\n },\n actions: (deps) =>\n actions.reduce(\n (obj, [name, cb]) => {\n obj[name] = cb(deps);\n return obj;\n },\n {} as Record<string, ActionSpec>,\n ),\n };\n }\n}\n"]}
1
+ {"version":3,"file":"ExtensionBuilder.js","sourceRoot":"../../../src","sources":["core/ExtensionBuilder.ts"],"names":[],"mappings":"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","sourcesContent":["import type MarkdownIt from 'markdown-it';\nimport OrderedMap from 'orderedmap';\nimport {inputRules} from 'prosemirror-inputrules';\nimport {keymap} from 'prosemirror-keymap';\nimport type {Plugin} from 'prosemirror-state';\n\nimport type {Logger2} from '../logger';\n\nimport type {ActionSpec} from './types/actions';\nimport type {\n Extension,\n ExtensionDeps,\n ExtensionMarkSpec,\n ExtensionNodeSpec,\n ExtensionSpec,\n ExtensionWithOptions,\n} from './types/extension';\nimport type {Keymap} from './types/keymap';\n\ntype InputRulesConfig = Parameters<typeof inputRules>[0];\ntype ExtensionWithParams = (builder: ExtensionBuilder, ...params: any[]) => void;\ntype ConfigureMdParams = {\n /**\n * Apply this configurtion to text parser\n * @default true\n */\n text?: boolean;\n /**\n * Apply this configurtion to markup parser\n * @default true\n */\n markup?: boolean;\n};\n\ntype ConfigureMdCallback = (md: MarkdownIt) => MarkdownIt;\ntype AddPmNodeCallback = () => ExtensionNodeSpec;\ntype AddPmMarkCallback = () => ExtensionMarkSpec;\ntype AddPmPluginCallback = (deps: ExtensionDeps) => Plugin | Plugin[];\ntype AddPmKeymapCallback = (deps: ExtensionDeps) => Keymap;\ntype AddPmInputRulesCallback = (deps: ExtensionDeps) => InputRulesConfig;\ntype AddActionCallback = (deps: ExtensionDeps) => ActionSpec;\n\nenum Priority {\n Highest = 1_000_000,\n VeryHigh = 100_000,\n High = 10_000,\n Medium = 1_000,\n Low = 100,\n VeryLow = 10,\n Lowest = 0,\n}\n\nconst DEFAULT_PRIORITY = Priority.Medium;\n\ntype BuilderContext<T extends object> = {\n has(key: keyof T): boolean;\n get<K extends keyof T>(key: K): T[K] | undefined;\n set<K extends keyof T>(key: K, value: T[K]): BuilderContext<T>;\n};\n\ndeclare global {\n namespace WysiwygEditor {\n interface Context {}\n }\n}\n\nexport class ExtensionBuilder {\n static createContext(): BuilderContext<WysiwygEditor.Context> {\n return new Map();\n }\n\n /* eslint-disable @typescript-eslint/member-ordering */\n static readonly Priority = Priority;\n readonly Priority = ExtensionBuilder.Priority;\n /* eslint-enable @typescript-eslint/member-ordering */\n\n readonly #logger: Logger2.ILogger;\n #confMdCbs: {cb: ConfigureMdCallback; params: Required<ConfigureMdParams>}[] = [];\n #nodeSpecs: Record<string, {name: string; cb: AddPmNodeCallback}> = {};\n #markSpecs: Record<string, {name: string; cb: AddPmMarkCallback; priority: number}> = {};\n #plugins: {cb: AddPmPluginCallback; priority: number}[] = [];\n #actions: [string, AddActionCallback][] = [];\n\n readonly context: BuilderContext<WysiwygEditor.Context>;\n\n constructor(logger: Logger2.ILogger, context?: BuilderContext<WysiwygEditor.Context>) {\n this.#logger = logger;\n this.context = context ?? ExtensionBuilder.createContext();\n }\n\n get logger(): Logger2.ILogger {\n return this.#logger;\n }\n\n use(extension: Extension): this;\n use<T>(extension: ExtensionWithOptions<T>, options: T): this;\n use(extension: ExtensionWithParams, ...params: any[]): this {\n extension(this, ...params);\n return this;\n }\n\n configureMd(cb: ConfigureMdCallback, params: ConfigureMdParams = {}): this {\n this.#confMdCbs.push({\n cb,\n params: {\n text: params.text ?? true,\n markup: params.markup ?? true,\n },\n });\n return this;\n }\n\n addNode(name: string, cb: AddPmNodeCallback): this {\n if (this.#nodeSpecs[name]) {\n throw new Error(`ProseMirror node with this name \"${name}\" already exist`);\n }\n this.#nodeSpecs[name] = {name, cb};\n return this;\n }\n\n addMark(name: string, cb: AddPmMarkCallback, priority = DEFAULT_PRIORITY): this {\n if (this.#markSpecs[name]) {\n throw new Error(`ProseMirror mark with this name \"${name}\" already exist`);\n }\n this.#markSpecs[name] = {name, cb, priority};\n return this;\n }\n\n addPlugin(cb: AddPmPluginCallback, priority = DEFAULT_PRIORITY): this {\n this.#plugins.push({cb, priority});\n return this;\n }\n\n addKeymap(cb: AddPmKeymapCallback, priority = DEFAULT_PRIORITY): this {\n this.#plugins.push({cb: (...args) => keymap(cb(...args)), priority});\n return this;\n }\n\n addInputRules(cb: AddPmInputRulesCallback, priority = DEFAULT_PRIORITY): this {\n this.#plugins.push({cb: (...args) => inputRules(cb(...args)), priority});\n return this;\n }\n\n addAction(name: string, cb: AddActionCallback): this {\n if (this.#actions.some(([actionName]) => actionName === name)) {\n throw new Error(\n `[Markdown Wysiwyg Editor] action with this name \"${name}\" already exist`,\n );\n }\n this.#actions.push([name, cb]);\n return this;\n }\n\n build(): ExtensionSpec {\n const confMd = this.#confMdCbs.slice();\n const nodes = {...this.#nodeSpecs};\n const marks = {...this.#markSpecs};\n const plugins = this.#plugins.slice();\n const actions = this.#actions.slice();\n\n return {\n configureMd: (md, parserType) =>\n confMd.reduce((pMd, {cb, params}) => {\n if (parserType === 'text' && params.text) {\n return cb(pMd);\n }\n if (parserType === 'markup' && params.markup) {\n return cb(pMd);\n }\n return pMd;\n }, md),\n nodes: () => {\n let map = OrderedMap.from<ExtensionNodeSpec>({});\n for (const {name, cb} of Object.values(nodes)) {\n map = map.addToEnd(name, cb());\n }\n return map;\n },\n marks: () => {\n // The order of marks in schema is important when serializing pm-document to DOM or markup\n // https://discuss.prosemirror.net/t/marks-priority/4463\n const sortedMarks = Object.values(marks).sort((a, b) => b.priority - a.priority);\n let map = OrderedMap.from<ExtensionMarkSpec>({});\n for (const {name, cb} of sortedMarks) {\n map = map.addToEnd(name, cb());\n }\n return map;\n },\n plugins: (deps) => {\n return plugins\n .sort((a, b) => b.priority - a.priority)\n .reduce<Plugin[]>((acc, {cb}) => {\n const res = cb(deps);\n if (Array.isArray(res)) acc.push(...res);\n else acc.push(res);\n return acc;\n }, []);\n },\n actions: (deps) =>\n actions.reduce(\n (obj, [name, cb]) => {\n obj[name] = cb(deps);\n return obj;\n },\n {} as Record<string, ActionSpec>,\n ),\n };\n }\n}\n"]}
@@ -1,9 +1,8 @@
1
- import type { Match } from 'linkify-it';
2
1
  import type MarkdownIt from 'markdown-it';
3
2
  import type Token from 'markdown-it/lib/token';
4
3
  import { Mark, type Node, type NodeType, type Schema } from 'prosemirror-model';
5
4
  import { type Logger2 } from "../../logger.js";
6
- import type { Parser, ParserToken } from "../types/parser.js";
5
+ import type { LinkMatch, Parser, ParserToken } from "../types/parser.js";
7
6
  import { type TransformFn } from "./ProseMirrorTransformer/index.js";
8
7
  export type TokenAttrs = {
9
8
  [name: string]: unknown;
@@ -30,7 +29,7 @@ export declare class MarkdownParser implements Parser {
30
29
  validateLink(url: string): boolean;
31
30
  normalizeLink(url: string): string;
32
31
  normalizeLinkText(url: string): string;
33
- matchLinks(text: string): Readonly<Match>[] | null;
32
+ matchLinks(text: string): Readonly<LinkMatch>[] | null;
34
33
  parse(src: string): Node;
35
34
  parse(tokens: Token[]): Node;
36
35
  private top;
@@ -1 +1 @@
1
- {"version":3,"file":"MarkdownParser.js","sourceRoot":"../../../../src","sources":["core/markdown/MarkdownParser.ts"],"names":[],"mappings":"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","sourcesContent":["import type {Match} from 'linkify-it'; // eslint-disable-line import/no-extraneous-dependencies\nimport type MarkdownIt from 'markdown-it';\nimport type Token from 'markdown-it/lib/token';\nimport {Mark, type MarkType, type Node, type NodeType, type Schema} from 'prosemirror-model';\n\nimport {type Logger2, logger} from '../../logger';\nimport type {Parser, ParserToken} from '../types/parser';\n\nimport {ProseMirrorTransformer, type TransformFn} from './ProseMirrorTransformer';\n\nexport type TokenAttrs = {[name: string]: unknown};\n\nconst openSuffix = '_open';\nconst closeSuffix = '_close';\nenum TokenType {\n open = 'open',\n close = 'close',\n default = 'default',\n}\n\n/**\n * Remove suffixes from the node name.\n * Crops specified `openSuffix` and `closeSuffix` from the end of the given `tokName`.\n */\nfunction cropNodeName(tokName: string, openSuffix: string, closeSuffix: string): string {\n const regex = new RegExp(`(${openSuffix})$|(${closeSuffix})$`);\n return tokName.replace(regex, '');\n}\n\ntype MarkdownParserOptions = {\n logger: Logger2.ILogger;\n pmTransformers: TransformFn[];\n dynamicModifier?: MarkdownParserDynamicModifier;\n};\n\nexport class MarkdownParser implements Parser {\n schema: Schema;\n stack: Array<{type: NodeType; attrs?: TokenAttrs; content: Array<Node>}> = [];\n marks: readonly Mark[];\n tokens: Record<string, ParserToken>;\n tokenizer: MarkdownIt;\n pmTransformers: TransformFn[];\n dynamicModifier: MarkdownParserDynamicModifier | null;\n\n private logger: Logger2.ILogger;\n\n constructor(\n schema: Schema,\n tokenizer: MarkdownIt,\n tokens: Record<string, ParserToken>,\n opts: MarkdownParserOptions,\n ) {\n this.schema = schema;\n\n this.marks = Mark.none;\n this.tokens = tokens;\n this.tokenizer = tokenizer;\n this.pmTransformers = opts.pmTransformers;\n this.dynamicModifier = opts.dynamicModifier ?? null;\n\n this.logger = opts.logger.nested({module: 'markdown-parser'});\n }\n\n validateLink(url: string): boolean {\n return this.tokenizer.validateLink(url);\n }\n\n normalizeLink(url: string): string {\n return this.tokenizer.normalizeLink(url);\n }\n\n normalizeLinkText(url: string): string {\n return this.tokenizer.normalizeLinkText(url);\n }\n\n matchLinks(text: string): Readonly<Match>[] | null {\n return this.tokenizer.linkify.match(text);\n }\n\n parse(src: string): Node;\n parse(tokens: Token[]): Node;\n parse(src: string | Token[]) {\n const time = Date.now();\n\n try {\n this.stack = [{type: this.schema.topNodeType, content: []}];\n\n let mdItTokens;\n try {\n mdItTokens = typeof src === 'string' ? this.tokenizer.parse(src, {}) : src;\n if (this.dynamicModifier) {\n mdItTokens = this.dynamicModifier.processTokens(\n mdItTokens,\n typeof src === 'string' ? src : null,\n );\n }\n } catch (err) {\n const e = err as Error;\n e.message = 'Unable to parse your markup. Please check for errors. ' + e.message;\n this.logger.error(e);\n throw e;\n }\n\n this.parseTokens(mdItTokens);\n\n let doc;\n\n // If after parsing there are still unclosed nodes, close them by removing them from the stack.\n do {\n doc = this.closeNode();\n } while (this.stack.length);\n\n const pmTransformer = new ProseMirrorTransformer(this.pmTransformers);\n\n return doc ? pmTransformer.transform(doc) : this.schema.topNodeType.createAndFill()!;\n } finally {\n logger.metrics({component: 'parser', event: 'parse', duration: Date.now() - time});\n this.logger.metrics({component: 'parser', event: 'parse', duration: Date.now() - time});\n }\n }\n\n private top() {\n return this.stack[this.stack.length - 1];\n }\n\n private push(elt: Node) {\n if (this.stack.length) this.top().content.push(elt);\n }\n\n //#region helpers\n\n private getTokenAttrs(\n token: Token,\n tokenSpec: ParserToken,\n tokenStream: Token[],\n i: number,\n ): TokenAttrs | undefined {\n let attrs: TokenAttrs | undefined = {};\n\n if (tokenSpec.getAttrs) {\n attrs = tokenSpec.getAttrs(token, tokenStream, i);\n } else if (tokenSpec.attrs instanceof Function) {\n attrs = tokenSpec.attrs(token);\n } else {\n attrs = tokenSpec.attrs;\n }\n\n if (this.dynamicModifier) {\n attrs = this.dynamicModifier.processAttrs(token, attrs ?? {});\n }\n\n return attrs;\n }\n\n private getTokenSpec(token: Token) {\n // Matching the pm-node meta-attribute which is set in the plugin for markdown-it\n let tokName = (token.meta?.['pm-node'] as string) || token.type;\n\n // Cropping _open and _close from node name end\n // e.g. paragraph_open -> paragraph\n tokName = cropNodeName(tokName, openSuffix, closeSuffix);\n\n let tokenSpec: ParserToken | undefined;\n if (tokName in this.tokens) {\n tokenSpec = this.tokens[tokName];\n }\n\n if (!tokenSpec) {\n throw new RangeError(`No token spec for token: ${JSON.stringify(token)}`);\n }\n\n return tokenSpec;\n }\n\n // Getting token type from its name\n // e.g. \"paragraph_open\" - is opening token for paragraph\n private getTokenType({type}: Token): keyof typeof TokenType {\n if (type.endsWith(openSuffix)) return TokenType.open;\n if (type.endsWith(closeSuffix)) return TokenType.close;\n\n return TokenType.default;\n }\n\n //#endregion\n\n //#region token handlers\n\n // Self-explanatory\n private handlePrimitiveToken(token: Token) {\n switch (token.type) {\n case 'text':\n this.addText(withoutTrailingNewline(token.content));\n return true;\n case 'inline':\n this.parseTokens(token.children || []);\n return true;\n case 'softbreak':\n // TODO: move all primitive token's handlers to extensions\n if (this.tokens.softbreak) return false;\n this.addText('\\n');\n return true;\n }\n\n return false;\n }\n\n private handleMark(token: Token, tokenSpec: ParserToken, attrs?: TokenAttrs) {\n const schemaSpec = this.schema.marks[tokenSpec.name];\n\n if (tokenSpec.noCloseToken) {\n this.openMark(schemaSpec.create(attrs));\n let {content} = token;\n if (!tokenSpec.code) content = withoutTrailingNewline(content);\n this.addText(content);\n this.closeMark(schemaSpec);\n\n return;\n }\n\n switch (this.getTokenType(token)) {\n case 'open': {\n this.openMark(schemaSpec.create(attrs));\n\n break;\n }\n case 'close': {\n this.closeMark(schemaSpec);\n\n break;\n }\n }\n }\n\n private getNodeSchema(tokenSpec: ParserToken) {\n const spec = this.schema.nodes[tokenSpec.name];\n return spec;\n }\n\n private handleNode(_token: Token, tokenSpec: ParserToken, attrs?: TokenAttrs) {\n const schemaSpec = this.getNodeSchema(tokenSpec);\n\n // Adding node as is, becasuse it doesn't contain content.\n this.addNode(schemaSpec, attrs);\n }\n\n private handleBlock(token: Token, tokenSpec: ParserToken, attrs?: TokenAttrs) {\n const schemaSpec = this.getNodeSchema(tokenSpec);\n\n if (tokenSpec.noCloseToken) {\n this.openNode(schemaSpec, attrs);\n\n if (tokenSpec.contentField === 'children' && token.children?.length) {\n this.parseTokens(token.children);\n } else {\n let {content} = token;\n if (tokenSpec.prepareContent) {\n content = tokenSpec.prepareContent(content);\n }\n this.addText(content);\n }\n\n this.closeNode();\n return;\n }\n\n switch (this.getTokenType(token)) {\n case 'open': {\n this.openNode(schemaSpec, attrs);\n\n break;\n }\n case 'close': {\n this.closeNode();\n\n break;\n }\n }\n }\n\n private handleToken(token: Token, tokenSpec: ParserToken, attrs?: TokenAttrs) {\n switch (tokenSpec.type) {\n case 'mark':\n this.handleMark(token, tokenSpec, attrs);\n break;\n case 'node':\n this.handleNode(token, tokenSpec, attrs);\n break;\n case 'block':\n this.handleBlock(token, tokenSpec, attrs);\n break;\n }\n }\n\n //#endregion\n\n //#region state methods\n\n private addNode(type: NodeType, attrs?: Object, content?: Node[]) {\n let node = type.createAndFill(attrs, content, this.marks);\n if (!node) {\n return null;\n }\n\n if (this.dynamicModifier) {\n node = this.dynamicModifier.processNodes(node);\n }\n\n this.push(node);\n\n return node;\n }\n\n private openNode(type: NodeType, attrs?: TokenAttrs) {\n this.stack.push({type: type, attrs, content: []});\n }\n\n private closeNode() {\n // Marks operate within a node. Therefore, when we close the node, we reset the existing marks.\n if (this.marks.length) {\n this.marks = Mark.none;\n }\n\n const info = this.stack.pop();\n if (info) {\n return this.addNode(info.type, info.attrs, info.content);\n }\n\n return null;\n }\n\n private addText(text: string) {\n if (!text) return;\n const nodes = this.top().content;\n const last = nodes[nodes.length - 1];\n const node = this.schema.text(text, this.marks);\n let merged;\n if (last && (merged = maybeMerge(last, node))) nodes[nodes.length - 1] = merged;\n else nodes.push(node);\n }\n\n // Adding mark to a set of open marks\n private openMark(mark: Mark) {\n this.marks = mark.addToSet(this.marks);\n }\n\n private closeMark(mark: MarkType) {\n this.marks = mark.removeFromSet(this.marks);\n }\n\n //#endregion\n\n private parseTokens(tokens: Token[]) {\n for (let i = 0; i < tokens.length; i++) {\n const token = tokens[i];\n\n if (this.handlePrimitiveToken(token)) continue;\n\n const tokenSpec = this.getTokenSpec(token);\n\n if (tokenSpec.ignore) continue;\n\n const attrs = this.getTokenAttrs(token, tokenSpec, tokens, i);\n\n this.handleToken(token, tokenSpec, attrs);\n }\n }\n}\n\n// Checking if these are two text nodes and they have the same marks, then it merges them into one.\nfunction maybeMerge(a: Node, b: Node) {\n if (a.isText && b.isText && Mark.sameSet(a.marks, b.marks)) {\n // Somehow this method is not in typings but it exists.\n // @ts-expect-error\n return a.withText(a.text + b.text);\n }\n}\n\nfunction withoutTrailingNewline(str: string) {\n return str[str.length - 1] === '\\n' || str.endsWith('\\\\n') ? str.slice(0, str.length - 1) : str;\n}\n\nexport type ProcessToken = (\n token: Token,\n index: number,\n rawMarkup: string | null,\n allowedAttrs?: string[],\n) => Token;\nexport type ProcessNodeAttrs = (\n token: Token,\n attrs: TokenAttrs,\n allowedAttrs?: string[],\n) => TokenAttrs;\nexport type ProcessNode = (node: Node) => Node;\n\nexport interface ElementProcessor {\n processToken?: ProcessToken[];\n processNodeAttrs?: ProcessNodeAttrs[];\n processNode?: ProcessNode[];\n}\n\nexport interface MarkdownParserDynamicModifierConfig {\n [elementType: string]: ElementProcessor;\n}\n\n/**\n * Class MarkdownParserDynamicModifier\n *\n * Provides a mechanism for dynamic modification of tokens and node attributes during parsing by a MarkdownParser.\n * It allows sequential processing of element types by applying a series of custom handlers:\n *\n * - `processToken`: An array of handlers that process tokens sequentially, each passing the result to the next.\n *\n * - `processNodeAttrs`: An array of handlers that modify and process node attributes.\n *\n * - `processNode`: An array of handlers that process and modify the resulting ProseMirror nodes.\n *\n * Example:\n * ```ts\n * const dynamicModifier = new MarkdownParserDynamicModifier({\n * paragraph: {\n * processToken: [\n * (token, index, rawMarkup, allowedAttrs) => {\n * token.attrSet('data-prefix', 'prefix-value');\n * return token;\n * },\n * (token) => {\n * console.log(`Processing token: ${token.type}`);\n * return token;\n * },\n * ],\n * processNodeAttrs: [\n * (token, attrs) => {\n * attrs['data-paragraph'] = token.attrGet('data-prefix');\n * return attrs;\n * },\n * (token, attrs) => {\n * console.log(`Processing attrs for token: ${token.type}`);\n * return attrs;\n * },\n * ],\n * processNode: [\n * (node) => {\n * console.log(`Processing node: ${node.type}`);\n * return node;\n * },\n * ],\n * },\n * });\n * ```\n *\n * This class extends the functionality of a MarkdownParser for scenarios such as:\n * - Adding default attributes to specific elements.\n * - Modifying token metadata.\n * - Logging or customizing processing steps for debugging.\n */\nexport class MarkdownParserDynamicModifier {\n private elementProcessors: Map<string, ElementProcessor>;\n\n constructor(config: MarkdownParserDynamicModifierConfig) {\n this.elementProcessors = new Map(Object.entries(config));\n }\n\n processTokens(tokens: Token[], rawMarkup: string | null): Token[] {\n return tokens.map((token, index) => {\n const processor = this.elementProcessors.get(cropNodeName(token.type, openSuffix, ''));\n\n const processedToken =\n processor?.processToken?.reduce((currentToken, process) => {\n return process(currentToken, index, rawMarkup);\n }, token) || token;\n\n if (processedToken.children) {\n processedToken.children = this.processTokens(processedToken.children, rawMarkup);\n }\n\n return processedToken;\n });\n }\n\n processAttrs(token: Token, attrs: TokenAttrs): TokenAttrs {\n const processor = this.elementProcessors.get(cropNodeName(token.type, openSuffix, ''));\n if (!processor || !processor.processNodeAttrs || processor.processNodeAttrs.length === 0) {\n return attrs;\n }\n\n return processor.processNodeAttrs.reduce((currentAttrs, process) => {\n return process(token, currentAttrs);\n }, attrs);\n }\n\n processNodes(node: Node): Node {\n const processor = this.elementProcessors.get(node.type.name);\n if (!processor || !processor.processNode || processor.processNode.length === 0) {\n return node;\n }\n\n return processor.processNode.reduce((currentNode, process) => {\n return process(currentNode);\n }, node);\n }\n}\n"]}
1
+ {"version":3,"file":"MarkdownParser.js","sourceRoot":"../../../../src","sources":["core/markdown/MarkdownParser.ts"],"names":[],"mappings":"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","sourcesContent":["import type MarkdownIt from 'markdown-it';\nimport type Token from 'markdown-it/lib/token';\nimport {Mark, type MarkType, type Node, type NodeType, type Schema} from 'prosemirror-model';\n\nimport {type Logger2, logger} from '../../logger';\nimport type {LinkMatch, Parser, ParserToken} from '../types/parser';\n\nimport {ProseMirrorTransformer, type TransformFn} from './ProseMirrorTransformer';\n\nexport type TokenAttrs = {[name: string]: unknown};\n\nconst openSuffix = '_open';\nconst closeSuffix = '_close';\nenum TokenType {\n open = 'open',\n close = 'close',\n default = 'default',\n}\n\n/**\n * Remove suffixes from the node name.\n * Crops specified `openSuffix` and `closeSuffix` from the end of the given `tokName`.\n */\nfunction cropNodeName(tokName: string, openSuffix: string, closeSuffix: string): string {\n const regex = new RegExp(`(${openSuffix})$|(${closeSuffix})$`);\n return tokName.replace(regex, '');\n}\n\ntype MarkdownParserOptions = {\n logger: Logger2.ILogger;\n pmTransformers: TransformFn[];\n dynamicModifier?: MarkdownParserDynamicModifier;\n};\n\nexport class MarkdownParser implements Parser {\n schema: Schema;\n stack: Array<{type: NodeType; attrs?: TokenAttrs; content: Array<Node>}> = [];\n marks: readonly Mark[];\n tokens: Record<string, ParserToken>;\n tokenizer: MarkdownIt;\n pmTransformers: TransformFn[];\n dynamicModifier: MarkdownParserDynamicModifier | null;\n\n private logger: Logger2.ILogger;\n\n constructor(\n schema: Schema,\n tokenizer: MarkdownIt,\n tokens: Record<string, ParserToken>,\n opts: MarkdownParserOptions,\n ) {\n this.schema = schema;\n\n this.marks = Mark.none;\n this.tokens = tokens;\n this.tokenizer = tokenizer;\n this.pmTransformers = opts.pmTransformers;\n this.dynamicModifier = opts.dynamicModifier ?? null;\n\n this.logger = opts.logger.nested({module: 'markdown-parser'});\n }\n\n validateLink(url: string): boolean {\n return this.tokenizer.validateLink(url);\n }\n\n normalizeLink(url: string): string {\n return this.tokenizer.normalizeLink(url);\n }\n\n normalizeLinkText(url: string): string {\n return this.tokenizer.normalizeLinkText(url);\n }\n\n matchLinks(text: string): Readonly<LinkMatch>[] | null {\n return this.tokenizer.linkify.match(text);\n }\n\n parse(src: string): Node;\n parse(tokens: Token[]): Node;\n parse(src: string | Token[]) {\n const time = Date.now();\n\n try {\n this.stack = [{type: this.schema.topNodeType, content: []}];\n\n let mdItTokens;\n try {\n mdItTokens = typeof src === 'string' ? this.tokenizer.parse(src, {}) : src;\n if (this.dynamicModifier) {\n mdItTokens = this.dynamicModifier.processTokens(\n mdItTokens,\n typeof src === 'string' ? src : null,\n );\n }\n } catch (err) {\n const e = err as Error;\n e.message = 'Unable to parse your markup. Please check for errors. ' + e.message;\n this.logger.error(e);\n throw e;\n }\n\n this.parseTokens(mdItTokens);\n\n let doc;\n\n // If after parsing there are still unclosed nodes, close them by removing them from the stack.\n do {\n doc = this.closeNode();\n } while (this.stack.length);\n\n const pmTransformer = new ProseMirrorTransformer(this.pmTransformers);\n\n return doc ? pmTransformer.transform(doc) : this.schema.topNodeType.createAndFill()!;\n } finally {\n logger.metrics({component: 'parser', event: 'parse', duration: Date.now() - time});\n this.logger.metrics({component: 'parser', event: 'parse', duration: Date.now() - time});\n }\n }\n\n private top() {\n return this.stack[this.stack.length - 1];\n }\n\n private push(elt: Node) {\n if (this.stack.length) this.top().content.push(elt);\n }\n\n //#region helpers\n\n private getTokenAttrs(\n token: Token,\n tokenSpec: ParserToken,\n tokenStream: Token[],\n i: number,\n ): TokenAttrs | undefined {\n let attrs: TokenAttrs | undefined = {};\n\n if (tokenSpec.getAttrs) {\n attrs = tokenSpec.getAttrs(token, tokenStream, i);\n } else if (tokenSpec.attrs instanceof Function) {\n attrs = tokenSpec.attrs(token);\n } else {\n attrs = tokenSpec.attrs;\n }\n\n if (this.dynamicModifier) {\n attrs = this.dynamicModifier.processAttrs(token, attrs ?? {});\n }\n\n return attrs;\n }\n\n private getTokenSpec(token: Token) {\n // Matching the pm-node meta-attribute which is set in the plugin for markdown-it\n let tokName = (token.meta?.['pm-node'] as string) || token.type;\n\n // Cropping _open and _close from node name end\n // e.g. paragraph_open -> paragraph\n tokName = cropNodeName(tokName, openSuffix, closeSuffix);\n\n let tokenSpec: ParserToken | undefined;\n if (tokName in this.tokens) {\n tokenSpec = this.tokens[tokName];\n }\n\n if (!tokenSpec) {\n throw new RangeError(`No token spec for token: ${JSON.stringify(token)}`);\n }\n\n return tokenSpec;\n }\n\n // Getting token type from its name\n // e.g. \"paragraph_open\" - is opening token for paragraph\n private getTokenType({type}: Token): keyof typeof TokenType {\n if (type.endsWith(openSuffix)) return TokenType.open;\n if (type.endsWith(closeSuffix)) return TokenType.close;\n\n return TokenType.default;\n }\n\n //#endregion\n\n //#region token handlers\n\n // Self-explanatory\n private handlePrimitiveToken(token: Token) {\n switch (token.type) {\n case 'text':\n this.addText(withoutTrailingNewline(token.content));\n return true;\n case 'inline':\n this.parseTokens(token.children || []);\n return true;\n case 'softbreak':\n // TODO: move all primitive token's handlers to extensions\n if (this.tokens.softbreak) return false;\n this.addText('\\n');\n return true;\n }\n\n return false;\n }\n\n private handleMark(token: Token, tokenSpec: ParserToken, attrs?: TokenAttrs) {\n const schemaSpec = this.schema.marks[tokenSpec.name];\n\n if (tokenSpec.noCloseToken) {\n this.openMark(schemaSpec.create(attrs));\n let {content} = token;\n if (!tokenSpec.code) content = withoutTrailingNewline(content);\n this.addText(content);\n this.closeMark(schemaSpec);\n\n return;\n }\n\n switch (this.getTokenType(token)) {\n case 'open': {\n this.openMark(schemaSpec.create(attrs));\n\n break;\n }\n case 'close': {\n this.closeMark(schemaSpec);\n\n break;\n }\n }\n }\n\n private getNodeSchema(tokenSpec: ParserToken) {\n const spec = this.schema.nodes[tokenSpec.name];\n return spec;\n }\n\n private handleNode(_token: Token, tokenSpec: ParserToken, attrs?: TokenAttrs) {\n const schemaSpec = this.getNodeSchema(tokenSpec);\n\n // Adding node as is, becasuse it doesn't contain content.\n this.addNode(schemaSpec, attrs);\n }\n\n private handleBlock(token: Token, tokenSpec: ParserToken, attrs?: TokenAttrs) {\n const schemaSpec = this.getNodeSchema(tokenSpec);\n\n if (tokenSpec.noCloseToken) {\n this.openNode(schemaSpec, attrs);\n\n if (tokenSpec.contentField === 'children' && token.children?.length) {\n this.parseTokens(token.children);\n } else {\n let {content} = token;\n if (tokenSpec.prepareContent) {\n content = tokenSpec.prepareContent(content);\n }\n this.addText(content);\n }\n\n this.closeNode();\n return;\n }\n\n switch (this.getTokenType(token)) {\n case 'open': {\n this.openNode(schemaSpec, attrs);\n\n break;\n }\n case 'close': {\n this.closeNode();\n\n break;\n }\n }\n }\n\n private handleToken(token: Token, tokenSpec: ParserToken, attrs?: TokenAttrs) {\n switch (tokenSpec.type) {\n case 'mark':\n this.handleMark(token, tokenSpec, attrs);\n break;\n case 'node':\n this.handleNode(token, tokenSpec, attrs);\n break;\n case 'block':\n this.handleBlock(token, tokenSpec, attrs);\n break;\n }\n }\n\n //#endregion\n\n //#region state methods\n\n private addNode(type: NodeType, attrs?: Object, content?: Node[]) {\n let node = type.createAndFill(attrs, content, this.marks);\n if (!node) {\n return null;\n }\n\n if (this.dynamicModifier) {\n node = this.dynamicModifier.processNodes(node);\n }\n\n this.push(node);\n\n return node;\n }\n\n private openNode(type: NodeType, attrs?: TokenAttrs) {\n this.stack.push({type: type, attrs, content: []});\n }\n\n private closeNode() {\n // Marks operate within a node. Therefore, when we close the node, we reset the existing marks.\n if (this.marks.length) {\n this.marks = Mark.none;\n }\n\n const info = this.stack.pop();\n if (info) {\n return this.addNode(info.type, info.attrs, info.content);\n }\n\n return null;\n }\n\n private addText(text: string) {\n if (!text) return;\n const nodes = this.top().content;\n const last = nodes[nodes.length - 1];\n const node = this.schema.text(text, this.marks);\n let merged;\n if (last && (merged = maybeMerge(last, node))) nodes[nodes.length - 1] = merged;\n else nodes.push(node);\n }\n\n // Adding mark to a set of open marks\n private openMark(mark: Mark) {\n this.marks = mark.addToSet(this.marks);\n }\n\n private closeMark(mark: MarkType) {\n this.marks = mark.removeFromSet(this.marks);\n }\n\n //#endregion\n\n private parseTokens(tokens: Token[]) {\n for (let i = 0; i < tokens.length; i++) {\n const token = tokens[i];\n\n if (this.handlePrimitiveToken(token)) continue;\n\n const tokenSpec = this.getTokenSpec(token);\n\n if (tokenSpec.ignore) continue;\n\n const attrs = this.getTokenAttrs(token, tokenSpec, tokens, i);\n\n this.handleToken(token, tokenSpec, attrs);\n }\n }\n}\n\n// Checking if these are two text nodes and they have the same marks, then it merges them into one.\nfunction maybeMerge(a: Node, b: Node) {\n if (a.isText && b.isText && Mark.sameSet(a.marks, b.marks)) {\n // Somehow this method is not in typings but it exists.\n // @ts-expect-error\n return a.withText(a.text + b.text);\n }\n}\n\nfunction withoutTrailingNewline(str: string) {\n return str[str.length - 1] === '\\n' || str.endsWith('\\\\n') ? str.slice(0, str.length - 1) : str;\n}\n\nexport type ProcessToken = (\n token: Token,\n index: number,\n rawMarkup: string | null,\n allowedAttrs?: string[],\n) => Token;\nexport type ProcessNodeAttrs = (\n token: Token,\n attrs: TokenAttrs,\n allowedAttrs?: string[],\n) => TokenAttrs;\nexport type ProcessNode = (node: Node) => Node;\n\nexport interface ElementProcessor {\n processToken?: ProcessToken[];\n processNodeAttrs?: ProcessNodeAttrs[];\n processNode?: ProcessNode[];\n}\n\nexport interface MarkdownParserDynamicModifierConfig {\n [elementType: string]: ElementProcessor;\n}\n\n/**\n * Class MarkdownParserDynamicModifier\n *\n * Provides a mechanism for dynamic modification of tokens and node attributes during parsing by a MarkdownParser.\n * It allows sequential processing of element types by applying a series of custom handlers:\n *\n * - `processToken`: An array of handlers that process tokens sequentially, each passing the result to the next.\n *\n * - `processNodeAttrs`: An array of handlers that modify and process node attributes.\n *\n * - `processNode`: An array of handlers that process and modify the resulting ProseMirror nodes.\n *\n * Example:\n * ```ts\n * const dynamicModifier = new MarkdownParserDynamicModifier({\n * paragraph: {\n * processToken: [\n * (token, index, rawMarkup, allowedAttrs) => {\n * token.attrSet('data-prefix', 'prefix-value');\n * return token;\n * },\n * (token) => {\n * console.log(`Processing token: ${token.type}`);\n * return token;\n * },\n * ],\n * processNodeAttrs: [\n * (token, attrs) => {\n * attrs['data-paragraph'] = token.attrGet('data-prefix');\n * return attrs;\n * },\n * (token, attrs) => {\n * console.log(`Processing attrs for token: ${token.type}`);\n * return attrs;\n * },\n * ],\n * processNode: [\n * (node) => {\n * console.log(`Processing node: ${node.type}`);\n * return node;\n * },\n * ],\n * },\n * });\n * ```\n *\n * This class extends the functionality of a MarkdownParser for scenarios such as:\n * - Adding default attributes to specific elements.\n * - Modifying token metadata.\n * - Logging or customizing processing steps for debugging.\n */\nexport class MarkdownParserDynamicModifier {\n private elementProcessors: Map<string, ElementProcessor>;\n\n constructor(config: MarkdownParserDynamicModifierConfig) {\n this.elementProcessors = new Map(Object.entries(config));\n }\n\n processTokens(tokens: Token[], rawMarkup: string | null): Token[] {\n return tokens.map((token, index) => {\n const processor = this.elementProcessors.get(cropNodeName(token.type, openSuffix, ''));\n\n const processedToken =\n processor?.processToken?.reduce((currentToken, process) => {\n return process(currentToken, index, rawMarkup);\n }, token) || token;\n\n if (processedToken.children) {\n processedToken.children = this.processTokens(processedToken.children, rawMarkup);\n }\n\n return processedToken;\n });\n }\n\n processAttrs(token: Token, attrs: TokenAttrs): TokenAttrs {\n const processor = this.elementProcessors.get(cropNodeName(token.type, openSuffix, ''));\n if (!processor || !processor.processNodeAttrs || processor.processNodeAttrs.length === 0) {\n return attrs;\n }\n\n return processor.processNodeAttrs.reduce((currentAttrs, process) => {\n return process(token, currentAttrs);\n }, attrs);\n }\n\n processNodes(node: Node): Node {\n const processor = this.elementProcessors.get(node.type.name);\n if (!processor || !processor.processNode || processor.processNode.length === 0) {\n return node;\n }\n\n return processor.processNode.reduce((currentNode, process) => {\n return process(currentNode);\n }, node);\n }\n}\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"extension.js","sourceRoot":"../../../../src","sources":["core/types/extension.ts"],"names":[],"mappings":"","sourcesContent":["import type MarkdownIt from 'markdown-it';\nimport type OrderedMap from 'orderedmap'; // eslint-disable-line import/no-extraneous-dependencies\nimport type {MarkSpec, NodeSpec, Schema} from 'prosemirror-model';\nimport type {Plugin} from 'prosemirror-state';\n\nimport type {ExtensionBuilder} from '../ExtensionBuilder';\n\nimport type {ActionSpec, ActionStorage} from './actions';\nimport type {MarkViewConstructor, NodeViewConstructor} from './node-views';\nimport type {Parser, ParserToken} from './parser';\nimport type {Serializer, SerializerMarkToken, SerializerNodeToken} from './serializer';\n\nexport type Extension = (builder: ExtensionBuilder) => void;\nexport type ExtensionWithOptions<T> = (builder: ExtensionBuilder, options: T) => void;\nexport type ExtensionAuto<T = void> = T extends void ? Extension : ExtensionWithOptions<T>;\n\nexport type ExtensionSpec = {\n configureMd(md: MarkdownIt, parserType: 'text' | 'markup'): MarkdownIt;\n nodes(): OrderedMap<ExtensionNodeSpec>;\n marks(): OrderedMap<ExtensionMarkSpec>;\n plugins(deps: ExtensionDeps): Plugin[];\n actions(deps: ExtensionDeps): Record<string, ActionSpec>;\n};\n\nexport type ExtensionNodeSpec = {\n spec: NodeSpec;\n view?: (deps: ExtensionDeps) => NodeViewConstructor;\n fromMd: {\n tokenName?: string;\n tokenSpec: ParserToken;\n };\n toMd: SerializerNodeToken;\n};\n\nexport type ExtensionMarkSpec = {\n spec: MarkSpec;\n view?: (deps: ExtensionDeps) => MarkViewConstructor;\n fromMd: {\n tokenName?: string;\n tokenSpec: ParserToken;\n };\n toMd: SerializerMarkToken;\n};\n\nexport type ExtensionDeps = {\n readonly schema: Schema;\n readonly textParser: Parser;\n readonly markupParser: Parser;\n readonly serializer: Serializer;\n readonly actions: ActionStorage;\n};\n"]}
1
+ {"version":3,"file":"extension.js","sourceRoot":"../../../../src","sources":["core/types/extension.ts"],"names":[],"mappings":"","sourcesContent":["import type MarkdownIt from 'markdown-it';\nimport type OrderedMap from 'orderedmap';\nimport type {MarkSpec, NodeSpec, Schema} from 'prosemirror-model';\nimport type {Plugin} from 'prosemirror-state';\n\nimport type {ExtensionBuilder} from '../ExtensionBuilder';\n\nimport type {ActionSpec, ActionStorage} from './actions';\nimport type {MarkViewConstructor, NodeViewConstructor} from './node-views';\nimport type {Parser, ParserToken} from './parser';\nimport type {Serializer, SerializerMarkToken, SerializerNodeToken} from './serializer';\n\nexport type Extension = (builder: ExtensionBuilder) => void;\nexport type ExtensionWithOptions<T> = (builder: ExtensionBuilder, options: T) => void;\nexport type ExtensionAuto<T = void> = T extends void ? Extension : ExtensionWithOptions<T>;\n\nexport type ExtensionSpec = {\n configureMd(md: MarkdownIt, parserType: 'text' | 'markup'): MarkdownIt;\n nodes(): OrderedMap<ExtensionNodeSpec>;\n marks(): OrderedMap<ExtensionMarkSpec>;\n plugins(deps: ExtensionDeps): Plugin[];\n actions(deps: ExtensionDeps): Record<string, ActionSpec>;\n};\n\nexport type ExtensionNodeSpec = {\n spec: NodeSpec;\n view?: (deps: ExtensionDeps) => NodeViewConstructor;\n fromMd: {\n tokenName?: string;\n tokenSpec: ParserToken;\n };\n toMd: SerializerNodeToken;\n};\n\nexport type ExtensionMarkSpec = {\n spec: MarkSpec;\n view?: (deps: ExtensionDeps) => MarkViewConstructor;\n fromMd: {\n tokenName?: string;\n tokenSpec: ParserToken;\n };\n toMd: SerializerMarkToken;\n};\n\nexport type ExtensionDeps = {\n readonly schema: Schema;\n readonly textParser: Parser;\n readonly markupParser: Parser;\n readonly serializer: Serializer;\n readonly actions: ActionStorage;\n};\n"]}
@@ -1,6 +1,7 @@
1
- import type { Match } from 'linkify-it';
1
+ import type MarkdownIt from 'markdown-it';
2
2
  import type Token from 'markdown-it/lib/token';
3
3
  import type { Node } from 'prosemirror-model';
4
+ export type LinkMatch = Readonly<NonNullable<ReturnType<MarkdownIt['linkify']['match']>>[number]>;
4
5
  export interface Parser {
5
6
  /** Parse raw markup to prosemirror's root node */
6
7
  parse(markup: string): Node;
@@ -9,7 +10,7 @@ export interface Parser {
9
10
  validateLink(url: string): boolean;
10
11
  normalizeLink(url: string): string;
11
12
  normalizeLinkText(url: string): string;
12
- matchLinks(text: string): Readonly<Match>[] | null;
13
+ matchLinks(text: string): LinkMatch[] | null;
13
14
  }
14
15
  export interface ParserToken {
15
16
  name: string;
@@ -1 +1 @@
1
- {"version":3,"file":"parser.js","sourceRoot":"../../../../src","sources":["core/types/parser.ts"],"names":[],"mappings":"","sourcesContent":["import type {Match} from 'linkify-it'; // eslint-disable-line import/no-extraneous-dependencies\nimport type Token from 'markdown-it/lib/token';\nimport type {Node} from 'prosemirror-model';\n\nexport interface Parser {\n /** Parse raw markup to prosemirror's root node */\n parse(markup: string): Node;\n /** Parse markdown-it tokens stream to prosemirror's root node */\n parse(tokens: Token[]): Node;\n validateLink(url: string): boolean;\n normalizeLink(url: string): string;\n normalizeLinkText(url: string): string;\n matchLinks(text: string): Readonly<Match>[] | null;\n}\n\nexport interface ParserToken {\n name: string;\n type: 'node' | 'block' | 'mark';\n attrs?: {[name: string]: unknown};\n getAttrs?: (token: Token, tokens: Token[], index: number) => NonNullable<ParserToken['attrs']>;\n // It means that there is no closing token\n // That is, the content lies in the content field of the token, and not between the opening and closing tokens.\n noCloseToken?: boolean;\n ignore?: boolean;\n code?: boolean;\n /** only for tokens with type=block */\n prepareContent?: (content: string) => string;\n /**\n * only for tokens with type=block and noCloseToken=true\n * @default 'content'\n */\n contentField?: 'content' | 'children';\n}\n"]}
1
+ {"version":3,"file":"parser.js","sourceRoot":"../../../../src","sources":["core/types/parser.ts"],"names":[],"mappings":"","sourcesContent":["import type MarkdownIt from 'markdown-it';\nimport type Token from 'markdown-it/lib/token';\nimport type {Node} from 'prosemirror-model';\n\nexport type LinkMatch = Readonly<NonNullable<ReturnType<MarkdownIt['linkify']['match']>>[number]>;\n\nexport interface Parser {\n /** Parse raw markup to prosemirror's root node */\n parse(markup: string): Node;\n /** Parse markdown-it tokens stream to prosemirror's root node */\n parse(tokens: Token[]): Node;\n validateLink(url: string): boolean;\n normalizeLink(url: string): string;\n normalizeLinkText(url: string): string;\n matchLinks(text: string): LinkMatch[] | null;\n}\n\nexport interface ParserToken {\n name: string;\n type: 'node' | 'block' | 'mark';\n attrs?: {[name: string]: unknown};\n getAttrs?: (token: Token, tokens: Token[], index: number) => NonNullable<ParserToken['attrs']>;\n // It means that there is no closing token\n // That is, the content lies in the content field of the token, and not between the opening and closing tokens.\n noCloseToken?: boolean;\n ignore?: boolean;\n code?: boolean;\n /** only for tokens with type=block */\n prepareContent?: (content: string) => string;\n /**\n * only for tokens with type=block and noCloseToken=true\n * @default 'content'\n */\n contentField?: 'content' | 'children';\n}\n"]}
@@ -121,9 +121,7 @@ class GptWidgetDecoView {
121
121
  }
122
122
  }
123
123
  _getCurrentDecoration() {
124
- return this._getPluginState()?.find(undefined, undefined,
125
- // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access, @typescript-eslint/no-unsafe-return
126
- (spec) => spec[constants_1.WIDGET_DECO_SPEC_FLAG])[0];
124
+ return this._getPluginState()?.find(undefined, undefined, (spec) => spec[constants_1.WIDGET_DECO_SPEC_FLAG])[0];
127
125
  }
128
126
  _getPluginState() {
129
127
  return plugin_1.pluginKey.getState(this._view.state);