@gravity-ui/markdown-editor 15.35.1 → 15.37.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 (205) hide show
  1. package/README.md +87 -0
  2. package/build/cjs/core/Editor.js +2 -0
  3. package/build/cjs/core/Editor.js.map +1 -1
  4. package/build/cjs/core/index.d.ts +1 -0
  5. package/build/cjs/core/index.js +3 -1
  6. package/build/cjs/core/index.js.map +1 -1
  7. package/build/cjs/core/markdown/MarkdownParser.d.ts +1 -0
  8. package/build/cjs/core/markdown/MarkdownParser.js +3 -0
  9. package/build/cjs/core/markdown/MarkdownParser.js.map +1 -1
  10. package/build/cjs/core/types/parser.d.ts +1 -0
  11. package/build/cjs/core/types/parser.js.map +1 -1
  12. package/build/cjs/core/utils/parser.d.ts +3 -0
  13. package/build/cjs/core/utils/parser.js +12 -0
  14. package/build/cjs/core/utils/parser.js.map +1 -0
  15. package/build/cjs/extensions/additional/QuoteLink/QuoteLinkSpecs/index.js +1 -0
  16. package/build/cjs/extensions/additional/QuoteLink/QuoteLinkSpecs/index.js.map +1 -1
  17. package/build/cjs/extensions/behavior/Clipboard/clipboard.js +2 -13
  18. package/build/cjs/extensions/behavior/Clipboard/clipboard.js.map +1 -1
  19. package/build/cjs/extensions/behavior/Clipboard/selection-content.d.ts +1 -0
  20. package/build/cjs/extensions/behavior/Clipboard/selection-content.js +35 -0
  21. package/build/cjs/extensions/behavior/Clipboard/selection-content.js.map +1 -0
  22. package/build/cjs/extensions/behavior/Selection/commands.d.ts +2 -1
  23. package/build/cjs/extensions/behavior/Selection/commands.js +47 -1
  24. package/build/cjs/extensions/behavior/Selection/commands.js.map +1 -1
  25. package/build/cjs/extensions/behavior/Selection/selection.d.ts +15 -0
  26. package/build/cjs/extensions/behavior/Selection/selection.js +1 -0
  27. package/build/cjs/extensions/behavior/Selection/selection.js.map +1 -1
  28. package/build/cjs/extensions/behavior/SelectionContext/tooltip.js +3 -0
  29. package/build/cjs/extensions/behavior/SelectionContext/tooltip.js.map +1 -1
  30. package/build/cjs/extensions/markdown/Blockquote/BlockquoteSpecs/index.js +1 -0
  31. package/build/cjs/extensions/markdown/Blockquote/BlockquoteSpecs/index.js.map +1 -1
  32. package/build/cjs/extensions/markdown/Bold/index.js +1 -1
  33. package/build/cjs/extensions/markdown/Bold/index.js.map +1 -1
  34. package/build/cjs/extensions/markdown/Code/index.js +1 -1
  35. package/build/cjs/extensions/markdown/Code/index.js.map +1 -1
  36. package/build/cjs/extensions/markdown/CodeBlock/CodeBlockHighlight/CodeBlockHighlight.d.ts +2 -2
  37. package/build/cjs/extensions/markdown/CodeBlock/CodeBlockHighlight/CodeBlockHighlight.js +79 -128
  38. package/build/cjs/extensions/markdown/CodeBlock/CodeBlockHighlight/CodeBlockHighlight.js.map +1 -1
  39. package/build/cjs/extensions/markdown/CodeBlock/CodeBlockHighlight/TooltipPlugin/CodeBlockToolbar.d.ts +14 -0
  40. package/build/cjs/extensions/markdown/CodeBlock/CodeBlockHighlight/TooltipPlugin/CodeBlockToolbar.js +117 -0
  41. package/build/cjs/extensions/markdown/CodeBlock/CodeBlockHighlight/TooltipPlugin/CodeBlockToolbar.js.map +1 -0
  42. package/build/cjs/extensions/markdown/CodeBlock/CodeBlockHighlight/TooltipPlugin/CodeLangSelect.d.ts +9 -0
  43. package/build/cjs/extensions/markdown/CodeBlock/CodeBlockHighlight/TooltipPlugin/CodeLangSelect.js +22 -0
  44. package/build/cjs/extensions/markdown/CodeBlock/CodeBlockHighlight/TooltipPlugin/CodeLangSelect.js.map +1 -0
  45. package/build/cjs/extensions/markdown/CodeBlock/CodeBlockHighlight/TooltipPlugin/index.d.ts +2 -3
  46. package/build/cjs/extensions/markdown/CodeBlock/CodeBlockHighlight/TooltipPlugin/index.js +5 -93
  47. package/build/cjs/extensions/markdown/CodeBlock/CodeBlockHighlight/TooltipPlugin/index.js.map +1 -1
  48. package/build/cjs/extensions/markdown/CodeBlock/CodeBlockHighlight/plugins/codeBlockLangsPlugin.d.ts +23 -0
  49. package/build/cjs/extensions/markdown/CodeBlock/CodeBlockHighlight/plugins/codeBlockLangsPlugin.js +88 -0
  50. package/build/cjs/extensions/markdown/CodeBlock/CodeBlockHighlight/plugins/codeBlockLangsPlugin.js.map +1 -0
  51. package/build/cjs/extensions/markdown/CodeBlock/CodeBlockHighlight/plugins/codeBlockLineNumbersPlugin.js +42 -22
  52. package/build/cjs/extensions/markdown/CodeBlock/CodeBlockHighlight/plugins/codeBlockLineNumbersPlugin.js.map +1 -1
  53. package/build/cjs/extensions/markdown/CodeBlock/CodeBlockHighlight/utils.js +20 -0
  54. package/build/cjs/extensions/markdown/CodeBlock/CodeBlockHighlight/utils.js.map +1 -1
  55. package/build/cjs/extensions/markdown/Deflist/DeflistSpecs/schema.js +2 -0
  56. package/build/cjs/extensions/markdown/Deflist/DeflistSpecs/schema.js.map +1 -1
  57. package/build/cjs/extensions/markdown/Italic/index.js +1 -1
  58. package/build/cjs/extensions/markdown/Italic/index.js.map +1 -1
  59. package/build/cjs/extensions/markdown/Mark/index.js +1 -1
  60. package/build/cjs/extensions/markdown/Mark/index.js.map +1 -1
  61. package/build/cjs/extensions/markdown/Strike/index.js +1 -1
  62. package/build/cjs/extensions/markdown/Strike/index.js.map +1 -1
  63. package/build/cjs/extensions/markdown/Table/TableSpecs/schema.js +1 -0
  64. package/build/cjs/extensions/markdown/Table/TableSpecs/schema.js.map +1 -1
  65. package/build/cjs/extensions/markdown/Underline/index.js +1 -1
  66. package/build/cjs/extensions/markdown/Underline/index.js.map +1 -1
  67. package/build/cjs/extensions/yfm/Monospace/index.js +1 -1
  68. package/build/cjs/extensions/yfm/Monospace/index.js.map +1 -1
  69. package/build/cjs/extensions/yfm/YfmCut/YfmCutSpecs/schema.js +2 -0
  70. package/build/cjs/extensions/yfm/YfmCut/YfmCutSpecs/schema.js.map +1 -1
  71. package/build/cjs/extensions/yfm/YfmNote/YfmNoteSpecs/schema.js +2 -0
  72. package/build/cjs/extensions/yfm/YfmNote/YfmNoteSpecs/schema.js.map +1 -1
  73. package/build/cjs/extensions/yfm/YfmNote/plugins/YfmNoteTooltipPlugin/YfmNoteToolbar.css +20 -0
  74. package/build/cjs/extensions/yfm/YfmNote/plugins/YfmNoteTooltipPlugin/YfmNoteToolbar.d.ts +9 -0
  75. package/build/cjs/extensions/yfm/YfmNote/plugins/YfmNoteTooltipPlugin/YfmNoteToolbar.js +77 -0
  76. package/build/cjs/extensions/yfm/YfmNote/plugins/YfmNoteTooltipPlugin/YfmNoteToolbar.js.map +1 -0
  77. package/build/cjs/extensions/yfm/YfmNote/plugins/YfmNoteTooltipPlugin/index.d.ts +1 -2
  78. package/build/cjs/extensions/yfm/YfmNote/plugins/YfmNoteTooltipPlugin/index.js +5 -65
  79. package/build/cjs/extensions/yfm/YfmNote/plugins/YfmNoteTooltipPlugin/index.js.map +1 -1
  80. package/build/cjs/extensions/yfm/YfmTable/YfmTableSpecs/schema.js +2 -0
  81. package/build/cjs/extensions/yfm/YfmTable/YfmTableSpecs/schema.js.map +1 -1
  82. package/build/cjs/extensions/yfm/YfmTabs/YfmTabsSpecs/schema.js +3 -0
  83. package/build/cjs/extensions/yfm/YfmTabs/YfmTabsSpecs/schema.js.map +1 -1
  84. package/build/cjs/plugins/BaseTooltip/index.d.ts +1 -0
  85. package/build/cjs/plugins/BaseTooltip/index.js +4 -3
  86. package/build/cjs/plugins/BaseTooltip/index.js.map +1 -1
  87. package/build/cjs/toolbar/ToolbarGroup.js +4 -3
  88. package/build/cjs/toolbar/ToolbarGroup.js.map +1 -1
  89. package/build/cjs/toolbar/types.d.ts +2 -0
  90. package/build/cjs/toolbar/types.js.map +1 -1
  91. package/build/cjs/utils/actions.d.ts +6 -0
  92. package/build/cjs/utils/actions.js +24 -0
  93. package/build/cjs/utils/actions.js.map +1 -1
  94. package/build/cjs/utils/marks.d.ts +6 -0
  95. package/build/cjs/utils/marks.js +31 -0
  96. package/build/cjs/utils/marks.js.map +1 -1
  97. package/build/cjs/utils/transaction.d.ts +1 -0
  98. package/build/cjs/utils/transaction.js +40 -0
  99. package/build/cjs/utils/transaction.js.map +1 -0
  100. package/build/cjs/version.js +1 -1
  101. package/build/cjs/version.js.map +1 -1
  102. package/build/esm/core/Editor.js +2 -0
  103. package/build/esm/core/Editor.js.map +1 -1
  104. package/build/esm/core/index.d.ts +1 -0
  105. package/build/esm/core/index.js +1 -0
  106. package/build/esm/core/index.js.map +1 -1
  107. package/build/esm/core/markdown/MarkdownParser.d.ts +1 -0
  108. package/build/esm/core/markdown/MarkdownParser.js +3 -0
  109. package/build/esm/core/markdown/MarkdownParser.js.map +1 -1
  110. package/build/esm/core/types/parser.d.ts +1 -0
  111. package/build/esm/core/types/parser.js.map +1 -1
  112. package/build/esm/core/utils/parser.d.ts +3 -0
  113. package/build/esm/core/utils/parser.js +8 -0
  114. package/build/esm/core/utils/parser.js.map +1 -0
  115. package/build/esm/extensions/additional/QuoteLink/QuoteLinkSpecs/index.js +1 -0
  116. package/build/esm/extensions/additional/QuoteLink/QuoteLinkSpecs/index.js.map +1 -1
  117. package/build/esm/extensions/behavior/Clipboard/clipboard.js +1 -12
  118. package/build/esm/extensions/behavior/Clipboard/clipboard.js.map +1 -1
  119. package/build/esm/extensions/behavior/Clipboard/selection-content.d.ts +1 -0
  120. package/build/esm/extensions/behavior/Clipboard/selection-content.js +32 -0
  121. package/build/esm/extensions/behavior/Clipboard/selection-content.js.map +1 -0
  122. package/build/esm/extensions/behavior/Selection/commands.d.ts +2 -1
  123. package/build/esm/extensions/behavior/Selection/commands.js +47 -2
  124. package/build/esm/extensions/behavior/Selection/commands.js.map +1 -1
  125. package/build/esm/extensions/behavior/Selection/selection.d.ts +15 -0
  126. package/build/esm/extensions/behavior/Selection/selection.js +2 -1
  127. package/build/esm/extensions/behavior/Selection/selection.js.map +1 -1
  128. package/build/esm/extensions/behavior/SelectionContext/tooltip.js +3 -0
  129. package/build/esm/extensions/behavior/SelectionContext/tooltip.js.map +1 -1
  130. package/build/esm/extensions/markdown/Blockquote/BlockquoteSpecs/index.js +1 -0
  131. package/build/esm/extensions/markdown/Blockquote/BlockquoteSpecs/index.js.map +1 -1
  132. package/build/esm/extensions/markdown/Bold/index.js +2 -2
  133. package/build/esm/extensions/markdown/Bold/index.js.map +1 -1
  134. package/build/esm/extensions/markdown/Code/index.js +2 -2
  135. package/build/esm/extensions/markdown/Code/index.js.map +1 -1
  136. package/build/esm/extensions/markdown/CodeBlock/CodeBlockHighlight/CodeBlockHighlight.d.ts +2 -2
  137. package/build/esm/extensions/markdown/CodeBlock/CodeBlockHighlight/CodeBlockHighlight.js +79 -128
  138. package/build/esm/extensions/markdown/CodeBlock/CodeBlockHighlight/CodeBlockHighlight.js.map +1 -1
  139. package/build/esm/extensions/markdown/CodeBlock/CodeBlockHighlight/TooltipPlugin/CodeBlockToolbar.d.ts +14 -0
  140. package/build/esm/extensions/markdown/CodeBlock/CodeBlockHighlight/TooltipPlugin/CodeBlockToolbar.js +114 -0
  141. package/build/esm/extensions/markdown/CodeBlock/CodeBlockHighlight/TooltipPlugin/CodeBlockToolbar.js.map +1 -0
  142. package/build/esm/extensions/markdown/CodeBlock/CodeBlockHighlight/TooltipPlugin/CodeLangSelect.d.ts +9 -0
  143. package/build/esm/extensions/markdown/CodeBlock/CodeBlockHighlight/TooltipPlugin/CodeLangSelect.js +19 -0
  144. package/build/esm/extensions/markdown/CodeBlock/CodeBlockHighlight/TooltipPlugin/CodeLangSelect.js.map +1 -0
  145. package/build/esm/extensions/markdown/CodeBlock/CodeBlockHighlight/TooltipPlugin/index.d.ts +2 -3
  146. package/build/esm/extensions/markdown/CodeBlock/CodeBlockHighlight/TooltipPlugin/index.js +6 -94
  147. package/build/esm/extensions/markdown/CodeBlock/CodeBlockHighlight/TooltipPlugin/index.js.map +1 -1
  148. package/build/esm/extensions/markdown/CodeBlock/CodeBlockHighlight/plugins/codeBlockLangsPlugin.d.ts +23 -0
  149. package/build/esm/extensions/markdown/CodeBlock/CodeBlockHighlight/plugins/codeBlockLangsPlugin.js +83 -0
  150. package/build/esm/extensions/markdown/CodeBlock/CodeBlockHighlight/plugins/codeBlockLangsPlugin.js.map +1 -0
  151. package/build/esm/extensions/markdown/CodeBlock/CodeBlockHighlight/plugins/codeBlockLineNumbersPlugin.js +43 -23
  152. package/build/esm/extensions/markdown/CodeBlock/CodeBlockHighlight/plugins/codeBlockLineNumbersPlugin.js.map +1 -1
  153. package/build/esm/extensions/markdown/CodeBlock/CodeBlockHighlight/utils.js +20 -1
  154. package/build/esm/extensions/markdown/CodeBlock/CodeBlockHighlight/utils.js.map +1 -1
  155. package/build/esm/extensions/markdown/Deflist/DeflistSpecs/schema.js +2 -0
  156. package/build/esm/extensions/markdown/Deflist/DeflistSpecs/schema.js.map +1 -1
  157. package/build/esm/extensions/markdown/Italic/index.js +2 -2
  158. package/build/esm/extensions/markdown/Italic/index.js.map +1 -1
  159. package/build/esm/extensions/markdown/Mark/index.js +2 -2
  160. package/build/esm/extensions/markdown/Mark/index.js.map +1 -1
  161. package/build/esm/extensions/markdown/Strike/index.js +2 -2
  162. package/build/esm/extensions/markdown/Strike/index.js.map +1 -1
  163. package/build/esm/extensions/markdown/Table/TableSpecs/schema.js +1 -0
  164. package/build/esm/extensions/markdown/Table/TableSpecs/schema.js.map +1 -1
  165. package/build/esm/extensions/markdown/Underline/index.js +2 -2
  166. package/build/esm/extensions/markdown/Underline/index.js.map +1 -1
  167. package/build/esm/extensions/yfm/Monospace/index.js +2 -2
  168. package/build/esm/extensions/yfm/Monospace/index.js.map +1 -1
  169. package/build/esm/extensions/yfm/YfmCut/YfmCutSpecs/schema.js +2 -0
  170. package/build/esm/extensions/yfm/YfmCut/YfmCutSpecs/schema.js.map +1 -1
  171. package/build/esm/extensions/yfm/YfmNote/YfmNoteSpecs/schema.js +2 -0
  172. package/build/esm/extensions/yfm/YfmNote/YfmNoteSpecs/schema.js.map +1 -1
  173. package/build/esm/extensions/yfm/YfmNote/plugins/YfmNoteTooltipPlugin/YfmNoteToolbar.css +20 -0
  174. package/build/esm/extensions/yfm/YfmNote/plugins/YfmNoteTooltipPlugin/YfmNoteToolbar.d.ts +9 -0
  175. package/build/esm/extensions/yfm/YfmNote/plugins/YfmNoteTooltipPlugin/YfmNoteToolbar.js +74 -0
  176. package/build/esm/extensions/yfm/YfmNote/plugins/YfmNoteTooltipPlugin/YfmNoteToolbar.js.map +1 -0
  177. package/build/esm/extensions/yfm/YfmNote/plugins/YfmNoteTooltipPlugin/index.d.ts +1 -2
  178. package/build/esm/extensions/yfm/YfmNote/plugins/YfmNoteTooltipPlugin/index.js +4 -64
  179. package/build/esm/extensions/yfm/YfmNote/plugins/YfmNoteTooltipPlugin/index.js.map +1 -1
  180. package/build/esm/extensions/yfm/YfmTable/YfmTableSpecs/schema.js +2 -0
  181. package/build/esm/extensions/yfm/YfmTable/YfmTableSpecs/schema.js.map +1 -1
  182. package/build/esm/extensions/yfm/YfmTabs/YfmTabsSpecs/schema.js +3 -0
  183. package/build/esm/extensions/yfm/YfmTabs/YfmTabsSpecs/schema.js.map +1 -1
  184. package/build/esm/plugins/BaseTooltip/index.d.ts +1 -0
  185. package/build/esm/plugins/BaseTooltip/index.js +4 -3
  186. package/build/esm/plugins/BaseTooltip/index.js.map +1 -1
  187. package/build/esm/toolbar/ToolbarGroup.js +4 -3
  188. package/build/esm/toolbar/ToolbarGroup.js.map +1 -1
  189. package/build/esm/toolbar/types.d.ts +2 -0
  190. package/build/esm/toolbar/types.js.map +1 -1
  191. package/build/esm/utils/actions.d.ts +6 -0
  192. package/build/esm/utils/actions.js +24 -1
  193. package/build/esm/utils/actions.js.map +1 -1
  194. package/build/esm/utils/marks.d.ts +6 -0
  195. package/build/esm/utils/marks.js +30 -0
  196. package/build/esm/utils/marks.js.map +1 -1
  197. package/build/esm/utils/transaction.d.ts +1 -0
  198. package/build/esm/utils/transaction.js +36 -0
  199. package/build/esm/utils/transaction.js.map +1 -0
  200. package/build/esm/version.js +1 -1
  201. package/build/esm/version.js.map +1 -1
  202. package/build/styles.css +9 -5
  203. package/package.json +4 -3
  204. package/build/cjs/extensions/yfm/YfmNote/plugins/YfmNoteTooltipPlugin/index.css +0 -16
  205. package/build/esm/extensions/yfm/YfmNote/plugins/YfmNoteTooltipPlugin/index.css +0 -16
package/README.md ADDED
@@ -0,0 +1,87 @@
1
+ ![Markdown Editor](https://github.com/user-attachments/assets/0b4e5f65-54cf-475f-9c68-557a4e9edb46)
2
+
3
+ # @gravity-ui/markdown-editor · [![npm package](https://img.shields.io/npm/v/@gravity-ui/markdown-editor)](https://www.npmjs.com/package/@gravity-ui/markdown-editor) [![CI](https://img.shields.io/github/actions/workflow/status/gravity-ui/markdown-editor/ci.yml?branch=main&label=CI)](https://github.com/gravity-ui/markdown-editor/actions/workflows/ci.yml?query=branch:main) [![Release](https://img.shields.io/github/actions/workflow/status/gravity-ui/markdown-editor/release.yml?branch=main&label=Release)](https://github.com/gravity-ui/markdown-editor/actions/workflows/release.yml?query=branch:main) [![storybook](https://img.shields.io/badge/Storybook-deployed-ff4685)](https://preview.gravity-ui.com/md-editor/)
4
+
5
+ ## Markdown wysiwyg and markup editor
6
+
7
+ MarkdownEditor is a powerful tool for working with Markdown, which combines WYSIWYG and Markup modes. This means that you can create and edit content in a convenient visual mode, as well as have full control over the markup.
8
+
9
+ ### 🔧 Main features
10
+
11
+ - Support for the basic Markdown and [YFM](https://ydocs.tech) syntax.
12
+ - Extensibility through the use of ProseMirror and CodeMirror engines.
13
+ - The ability to work in WYSIWYG and Markup modes for maximum flexibility.
14
+
15
+ ## Install
16
+
17
+ ```shell
18
+ npm install @gravity-ui/markdown-editor
19
+ ```
20
+
21
+ ### Required dependencies
22
+
23
+ Please note that to start using the package, your project must also have the following installed: `@diplodoc/transform`, `react`, `react-dom`, `@gravity-ui/uikit`, `@gravity-ui/components` and some others. Check out the `peerDependencies` section of `package.json` for accurate information.
24
+
25
+ ## Getting started
26
+
27
+ The markdown editor is supplied as a React hook to create an instance of editor and a component for rendering the view.\
28
+ To set up styling and theme see [UIKit docs](https://github.com/gravity-ui/uikit?tab=readme-ov-file#styles).
29
+
30
+ ```tsx
31
+ import React from 'react';
32
+ import {useMarkdownEditor, MarkdownEditorView} from '@gravity-ui/markdown-editor';
33
+
34
+ function Editor({onSubmit}) {
35
+ const editor = useMarkdownEditor({allowHTML: false});
36
+
37
+ React.useEffect(() => {
38
+ function submitHandler() {
39
+ // Serialize current content to markdown markup
40
+ const value = editor.getValue();
41
+ onSubmit(value);
42
+ }
43
+
44
+ editor.on('submit', submitHandler);
45
+ return () => {
46
+ editor.off('submit', submitHandler);
47
+ };
48
+ }, [onSubmit]);
49
+
50
+ return <MarkdownEditorView stickyToolbar autofocus editor={editor} />;
51
+ }
52
+ ```
53
+ Read more:
54
+ - [How to connect the editor in the Create React App](https://preview.gravity-ui.com/md-editor/?path=/docs/docs-getting-started-create-react-app--docs)
55
+ - [How to add preview for markup mode](https://preview.gravity-ui.com/md-editor/?path=/docs/docs-getting-started-preview--docs)
56
+ - [How to add HTML extension](https://preview.gravity-ui.com/md-editor/?path=/docs/docs-extensions-html-block--docs)
57
+ - [How to add Latex extension](https://preview.gravity-ui.com/md-editor/?path=/docs/docs-extensions-latex-extension--docs)
58
+ - [How to add Mermaid extension](https://preview.gravity-ui.com/md-editor/?path=/docs/docs-extensions-mermaid-extension--docs)
59
+ - [How to write extension](https://preview.gravity-ui.com/md-editor/?path=/docs/docs-develop-extension-creation--docs)
60
+ - [How to add GPT extension](https://preview.gravity-ui.com/md-editor/?path=/docs/docs-extensions-gpt--docs)
61
+ - [How to add text binding extension in markdown](https://preview.gravity-ui.com/md-editor/?path=/docs/docs-develop-extension-with-popup--docs)
62
+
63
+ ### Development
64
+
65
+ 1. Install Nodejs environment, version is specified in `.nvmrc` file. We recommend using [NVM](https://github.com/nvm-sh/nvm) or a similar tool.
66
+ 2. Install [pnpm](https://pnpm.io/installation), version is specified in `package.json` in "packageManager" property.
67
+ 3. Install dependencies: `pnpm i`
68
+ 4. Run storybook dev-server: `pnpm start`
69
+
70
+
71
+ ### i18n
72
+
73
+ To set up internationalization, you just need to use the `configure`:
74
+
75
+ ```typescript
76
+ import {configure} from '@gravity-ui/markdown-editor';
77
+
78
+ configure({
79
+ lang: 'ru',
80
+ });
81
+ ```
82
+
83
+ Don't forget to call `configure()` from [UIKit](https://github.com/gravity-ui/uikit?tab=readme-ov-file#i18n) and other UI libraries.
84
+
85
+ ### Contributing
86
+
87
+ - [Contributor Guidelines](https://preview.gravity-ui.com/md-editor/?path=/docs/docs-contributing--docs)
@@ -13,6 +13,7 @@ const actions_1 = require("./utils/actions.js");
13
13
  const dynamicModifiers_1 = require("./utils/dynamicModifiers.js");
14
14
  const logger_2 = require("./utils/logger.js");
15
15
  const metrics_1 = require("./utils/metrics.js");
16
+ const parser_1 = require("./utils/parser.js");
16
17
  class WysiwygEditor {
17
18
  #view;
18
19
  #serializer;
@@ -55,6 +56,7 @@ class WysiwygEditor {
55
56
  dynamicModifiers,
56
57
  }, logger);
57
58
  plugins.unshift(logger_2.LoggerFacet.of(logger));
59
+ plugins.unshift(parser_1.ParserFacet.of(parser));
58
60
  const state = prosemirror_state_1.EditorState.create({
59
61
  schema,
60
62
  doc: parser.parse(initialContent),
@@ -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 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';\nimport {ParserFacet} from './utils/parser';\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 plugins.unshift(ParserFacet.of(parser));\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"]}
@@ -3,6 +3,7 @@ export * from "./ExtensionBuilder.js";
3
3
  export * from "./ExtensionsManager.js";
4
4
  export { bindActions } from "./utils/actions.js";
5
5
  export { getLoggerFromState } from "./utils/logger.js";
6
+ export { getParserFromState } from "./utils/parser.js";
6
7
  export { trackTransactionMetrics } from "./utils/metrics.js";
7
8
  export type { Keymap } from "./types/keymap.js";
8
9
  export type { ActionSpec, Action, ActionStorage, CommandWithAttrs } from "./types/actions.js";
@@ -1,6 +1,6 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.trackTransactionMetrics = exports.getLoggerFromState = exports.bindActions = void 0;
3
+ exports.trackTransactionMetrics = exports.getParserFromState = exports.getLoggerFromState = exports.bindActions = void 0;
4
4
  const tslib_1 = require("tslib");
5
5
  tslib_1.__exportStar(require("./Editor.js"), exports);
6
6
  tslib_1.__exportStar(require("./ExtensionBuilder.js"), exports);
@@ -9,6 +9,8 @@ var actions_1 = require("./utils/actions.js");
9
9
  Object.defineProperty(exports, "bindActions", { enumerable: true, get: function () { return actions_1.bindActions; } });
10
10
  var logger_1 = require("./utils/logger.js");
11
11
  Object.defineProperty(exports, "getLoggerFromState", { enumerable: true, get: function () { return logger_1.getLoggerFromState; } });
12
+ var parser_1 = require("./utils/parser.js");
13
+ Object.defineProperty(exports, "getParserFromState", { enumerable: true, get: function () { return parser_1.getParserFromState; } });
12
14
  var metrics_1 = require("./utils/metrics.js");
13
15
  Object.defineProperty(exports, "trackTransactionMetrics", { enumerable: true, get: function () { return metrics_1.trackTransactionMetrics; } });
14
16
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"../../../src","sources":["core/index.ts"],"names":[],"mappings":";;;;AAAA,sDAAyB;AACzB,gEAAmC;AACnC,iEAAoC;AACpC,8CAA4C;AAApC,sGAAA,WAAW,OAAA;AACnB,4CAAkD;AAA1C,4GAAA,kBAAkB,OAAA;AAC1B,8CAAwD;AAAhD,kHAAA,uBAAuB,OAAA","sourcesContent":["export * from './Editor';\nexport * from './ExtensionBuilder';\nexport * from './ExtensionsManager';\nexport {bindActions} from './utils/actions';\nexport {getLoggerFromState} from './utils/logger';\nexport {trackTransactionMetrics} from './utils/metrics';\nexport type {Keymap} from './types/keymap';\nexport type {ActionSpec, Action, ActionStorage, CommandWithAttrs} from './types/actions';\nexport type {\n Extension,\n ExtensionAuto,\n ExtensionWithOptions,\n ExtensionDeps,\n ExtensionNodeSpec,\n ExtensionMarkSpec,\n} from './types/extension';\nexport type {Parser, ParserToken} from './types/parser';\nexport type {\n Serializer,\n SerializerState,\n SerializerNodeToken,\n SerializerMarkToken,\n} from './types/serializer';\nexport type {NodeViewConstructor, MarkViewConstructor} from './types/node-views';\n\nexport type {MarkdownParserDynamicModifierConfig} from './markdown/MarkdownParser';\nexport type {MarkdownSerializerDynamicModifierConfig} from './markdown/MarkdownSerializerDynamicModifier';\n"]}
1
+ {"version":3,"file":"index.js","sourceRoot":"../../../src","sources":["core/index.ts"],"names":[],"mappings":";;;;AAAA,sDAAyB;AACzB,gEAAmC;AACnC,iEAAoC;AACpC,8CAA4C;AAApC,sGAAA,WAAW,OAAA;AACnB,4CAAkD;AAA1C,4GAAA,kBAAkB,OAAA;AAC1B,4CAAkD;AAA1C,4GAAA,kBAAkB,OAAA;AAC1B,8CAAwD;AAAhD,kHAAA,uBAAuB,OAAA","sourcesContent":["export * from './Editor';\nexport * from './ExtensionBuilder';\nexport * from './ExtensionsManager';\nexport {bindActions} from './utils/actions';\nexport {getLoggerFromState} from './utils/logger';\nexport {getParserFromState} from './utils/parser';\nexport {trackTransactionMetrics} from './utils/metrics';\nexport type {Keymap} from './types/keymap';\nexport type {ActionSpec, Action, ActionStorage, CommandWithAttrs} from './types/actions';\nexport type {\n Extension,\n ExtensionAuto,\n ExtensionWithOptions,\n ExtensionDeps,\n ExtensionNodeSpec,\n ExtensionMarkSpec,\n} from './types/extension';\nexport type {Parser, ParserToken} from './types/parser';\nexport type {\n Serializer,\n SerializerState,\n SerializerNodeToken,\n SerializerMarkToken,\n} from './types/serializer';\nexport type {NodeViewConstructor, MarkViewConstructor} from './types/node-views';\n\nexport type {MarkdownParserDynamicModifierConfig} from './markdown/MarkdownParser';\nexport type {MarkdownSerializerDynamicModifierConfig} from './markdown/MarkdownSerializerDynamicModifier';\n"]}
@@ -26,6 +26,7 @@ export declare class MarkdownParser implements Parser {
26
26
  dynamicModifier: MarkdownParserDynamicModifier | null;
27
27
  private logger;
28
28
  constructor(schema: Schema, tokenizer: MarkdownIt, tokens: Record<string, ParserToken>, opts: MarkdownParserOptions);
29
+ isPunctChar(char: string): boolean;
29
30
  validateLink(url: string): boolean;
30
31
  normalizeLink(url: string): string;
31
32
  normalizeLinkText(url: string): string;
@@ -38,6 +38,9 @@ class MarkdownParser {
38
38
  this.dynamicModifier = opts.dynamicModifier ?? null;
39
39
  this.logger = opts.logger.nested({ module: 'markdown-parser' });
40
40
  }
41
+ isPunctChar(char) {
42
+ return this.tokenizer.utils.isPunctChar(char);
43
+ }
41
44
  validateLink(url) {
42
45
  return this.tokenizer.validateLink(url);
43
46
  }
@@ -1 +1 @@
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
+ {"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 isPunctChar(char: string): boolean {\n return this.tokenizer.utils.isPunctChar(char);\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"]}
@@ -11,6 +11,7 @@ export interface Parser {
11
11
  normalizeLink(url: string): string;
12
12
  normalizeLinkText(url: string): string;
13
13
  matchLinks(text: string): LinkMatch[] | null;
14
+ isPunctChar(char: string): boolean;
14
15
  }
15
16
  export interface ParserToken {
16
17
  name: string;
@@ -1 +1 @@
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"]}
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 isPunctChar(char: string): boolean;\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"]}
@@ -0,0 +1,3 @@
1
+ import type { EditorState } from 'prosemirror-state';
2
+ import type { Parser } from "../types/parser.js";
3
+ export declare const getParserFromState: (state: EditorState) => Parser;
@@ -0,0 +1,12 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.getParserFromState = exports.ParserFacet = void 0;
4
+ const facet_1 = require("../../utils/facet.js");
5
+ /** @internal */
6
+ exports.ParserFacet = facet_1.Facet.define({
7
+ combine: (value) => value[0],
8
+ static: true,
9
+ });
10
+ const getParserFromState = (state) => exports.ParserFacet.getState(state);
11
+ exports.getParserFromState = getParserFromState;
12
+ //# sourceMappingURL=parser.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"parser.js","sourceRoot":"../../../../src","sources":["core/utils/parser.ts"],"names":[],"mappings":";;;AAEA,gDAAwC;AAGxC,gBAAgB;AACH,QAAA,WAAW,GAAG,aAAK,CAAC,MAAM,CAAiB;IACpD,OAAO,EAAE,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,CAAC,CAAC;IAC5B,MAAM,EAAE,IAAI;CACf,CAAC,CAAC;AAEI,MAAM,kBAAkB,GAAG,CAAC,KAAkB,EAAU,EAAE,CAAC,mBAAW,CAAC,QAAQ,CAAC,KAAK,CAAE,CAAC;AAAlF,QAAA,kBAAkB,sBAAgE","sourcesContent":["import type {EditorState} from 'prosemirror-state';\n\nimport {Facet} from '../../utils/facet';\nimport type {Parser} from '../types/parser';\n\n/** @internal */\nexport const ParserFacet = Facet.define<Parser, Parser>({\n combine: (value) => value[0],\n static: true,\n});\n\nexport const getParserFromState = (state: EditorState): Parser => ParserFacet.getState(state)!;\n"]}
@@ -46,6 +46,7 @@ const QuoteLinkSpecs = (builder) => {
46
46
  return ['blockquote', node.attrs, 0];
47
47
  },
48
48
  selectable: true,
49
+ selectAll: 'node',
49
50
  },
50
51
  fromMd: {
51
52
  tokenSpec: {
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"../../../../../../src","sources":["extensions/additional/QuoteLink/QuoteLinkSpecs/index.ts"],"names":[],"mappings":"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","sourcesContent":["import {transform as quoteLink} from '@diplodoc/quote-link-extension';\nimport type {Node} from 'prosemirror-model';\n\nimport type {ExtensionAuto} from '#core';\nimport {nodeTypeFactory} from 'src/utils';\n\nimport {moveLinkToQuoteAttributes} from './md/moveLinkToQuoteAttributes';\n\nexport const quoteLinkNodeName = 'yfm_quote-link';\nexport const quoteLinkType = nodeTypeFactory(quoteLinkNodeName);\nexport const isQuoteLinkNode = (node: Node) => node.type.name === quoteLinkNodeName;\n\nexport enum QuoteLinkAttr {\n Cite = 'cite',\n DataContent = 'data-content',\n}\n\nexport const QuoteLinkSpecs: ExtensionAuto = (builder) => {\n builder\n .configureMd((md) =>\n md\n .use(\n quoteLink({\n bundle: false,\n }),\n )\n .use(moveLinkToQuoteAttributes),\n )\n .addNode(quoteLinkNodeName, () => ({\n spec: {\n attrs: {\n class: {default: 'yfm-quote-link'},\n [QuoteLinkAttr.Cite]: {default: ''},\n [QuoteLinkAttr.DataContent]: {default: ''},\n },\n content: 'block+',\n group: 'block',\n defining: true,\n parseDOM: [\n {\n tag: '.yfm-quote-link',\n getAttrs(dom) {\n return {\n [QuoteLinkAttr.Cite]: (dom as Element).getAttribute(\n QuoteLinkAttr.Cite,\n ),\n [QuoteLinkAttr.DataContent]: (dom as Element).getAttribute(\n QuoteLinkAttr.DataContent,\n ),\n };\n },\n priority: builder.Priority.VeryHigh,\n },\n ],\n toDOM(node) {\n return ['blockquote', node.attrs, 0];\n },\n selectable: true,\n },\n fromMd: {\n tokenSpec: {\n name: quoteLinkNodeName,\n type: 'block',\n getAttrs: (tok) => ({\n [QuoteLinkAttr.Cite]: tok.attrGet('cite'),\n [QuoteLinkAttr.DataContent]: tok.attrGet('data-content') || null,\n }),\n },\n },\n toMd: (state, node) => {\n state.wrapBlock('> ', null, node, () => {\n state.write(\n `[${node.attrs[QuoteLinkAttr.DataContent]}](${\n node.attrs[QuoteLinkAttr.Cite]\n }){data-quotelink=true}`,\n );\n state.write('\\n');\n state.write('\\n');\n state.renderContent(node);\n });\n },\n }));\n};\n"]}
1
+ {"version":3,"file":"index.js","sourceRoot":"../../../../../../src","sources":["extensions/additional/QuoteLink/QuoteLinkSpecs/index.ts"],"names":[],"mappings":";;;AAAA,yEAAsE;AAItE,sDAA0C;AAE1C,iFAAyE;AAE5D,QAAA,iBAAiB,GAAG,gBAAgB,CAAC;AACrC,QAAA,aAAa,GAAG,IAAA,uBAAe,EAAC,yBAAiB,CAAC,CAAC;AACzD,MAAM,eAAe,GAAG,CAAC,IAAU,EAAE,EAAE,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,KAAK,yBAAiB,CAAC;AAAvE,QAAA,eAAe,mBAAwD;AAEpF,IAAY,aAGX;AAHD,WAAY,aAAa;IACrB,8BAAa,CAAA;IACb,6CAA4B,CAAA;AAChC,CAAC,EAHW,aAAa,6BAAb,aAAa,QAGxB;AAEM,MAAM,cAAc,GAAkB,CAAC,OAAO,EAAE,EAAE;IACrD,OAAO;SACF,WAAW,CAAC,CAAC,EAAE,EAAE,EAAE,CAChB,EAAE;SACG,GAAG,CACA,IAAA,gCAAS,EAAC;QACN,MAAM,EAAE,KAAK;KAChB,CAAC,CACL;SACA,GAAG,CAAC,qDAAyB,CAAC,CACtC;SACA,OAAO,CAAC,yBAAiB,EAAE,GAAG,EAAE,CAAC,CAAC;QAC/B,IAAI,EAAE;YACF,KAAK,EAAE;gBACH,KAAK,EAAE,EAAC,OAAO,EAAE,gBAAgB,EAAC;gBAClC,CAAC,aAAa,CAAC,IAAI,CAAC,EAAE,EAAC,OAAO,EAAE,EAAE,EAAC;gBACnC,CAAC,aAAa,CAAC,WAAW,CAAC,EAAE,EAAC,OAAO,EAAE,EAAE,EAAC;aAC7C;YACD,OAAO,EAAE,QAAQ;YACjB,KAAK,EAAE,OAAO;YACd,QAAQ,EAAE,IAAI;YACd,QAAQ,EAAE;gBACN;oBACI,GAAG,EAAE,iBAAiB;oBACtB,QAAQ,CAAC,GAAG;wBACR,OAAO;4BACH,CAAC,aAAa,CAAC,IAAI,CAAC,EAAG,GAAe,CAAC,YAAY,CAC/C,aAAa,CAAC,IAAI,CACrB;4BACD,CAAC,aAAa,CAAC,WAAW,CAAC,EAAG,GAAe,CAAC,YAAY,CACtD,aAAa,CAAC,WAAW,CAC5B;yBACJ,CAAC;oBACN,CAAC;oBACD,QAAQ,EAAE,OAAO,CAAC,QAAQ,CAAC,QAAQ;iBACtC;aACJ;YACD,KAAK,CAAC,IAAI;gBACN,OAAO,CAAC,YAAY,EAAE,IAAI,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC;YACzC,CAAC;YACD,UAAU,EAAE,IAAI;YAChB,SAAS,EAAE,MAAM;SACpB;QACD,MAAM,EAAE;YACJ,SAAS,EAAE;gBACP,IAAI,EAAE,yBAAiB;gBACvB,IAAI,EAAE,OAAO;gBACb,QAAQ,EAAE,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC;oBAChB,CAAC,aAAa,CAAC,IAAI,CAAC,EAAE,GAAG,CAAC,OAAO,CAAC,MAAM,CAAC;oBACzC,CAAC,aAAa,CAAC,WAAW,CAAC,EAAE,GAAG,CAAC,OAAO,CAAC,cAAc,CAAC,IAAI,IAAI;iBACnE,CAAC;aACL;SACJ;QACD,IAAI,EAAE,CAAC,KAAK,EAAE,IAAI,EAAE,EAAE;YAClB,KAAK,CAAC,SAAS,CAAC,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,GAAG,EAAE;gBACnC,KAAK,CAAC,KAAK,CACP,IAAI,IAAI,CAAC,KAAK,CAAC,aAAa,CAAC,WAAW,CAAC,KACrC,IAAI,CAAC,KAAK,CAAC,aAAa,CAAC,IAAI,CACjC,wBAAwB,CAC3B,CAAC;gBACF,KAAK,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;gBAClB,KAAK,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;gBAClB,KAAK,CAAC,aAAa,CAAC,IAAI,CAAC,CAAC;YAC9B,CAAC,CAAC,CAAC;QACP,CAAC;KACJ,CAAC,CAAC,CAAC;AACZ,CAAC,CAAC;AAlEW,QAAA,cAAc,kBAkEzB","sourcesContent":["import {transform as quoteLink} from '@diplodoc/quote-link-extension';\nimport type {Node} from 'prosemirror-model';\n\nimport type {ExtensionAuto} from '#core';\nimport {nodeTypeFactory} from 'src/utils';\n\nimport {moveLinkToQuoteAttributes} from './md/moveLinkToQuoteAttributes';\n\nexport const quoteLinkNodeName = 'yfm_quote-link';\nexport const quoteLinkType = nodeTypeFactory(quoteLinkNodeName);\nexport const isQuoteLinkNode = (node: Node) => node.type.name === quoteLinkNodeName;\n\nexport enum QuoteLinkAttr {\n Cite = 'cite',\n DataContent = 'data-content',\n}\n\nexport const QuoteLinkSpecs: ExtensionAuto = (builder) => {\n builder\n .configureMd((md) =>\n md\n .use(\n quoteLink({\n bundle: false,\n }),\n )\n .use(moveLinkToQuoteAttributes),\n )\n .addNode(quoteLinkNodeName, () => ({\n spec: {\n attrs: {\n class: {default: 'yfm-quote-link'},\n [QuoteLinkAttr.Cite]: {default: ''},\n [QuoteLinkAttr.DataContent]: {default: ''},\n },\n content: 'block+',\n group: 'block',\n defining: true,\n parseDOM: [\n {\n tag: '.yfm-quote-link',\n getAttrs(dom) {\n return {\n [QuoteLinkAttr.Cite]: (dom as Element).getAttribute(\n QuoteLinkAttr.Cite,\n ),\n [QuoteLinkAttr.DataContent]: (dom as Element).getAttribute(\n QuoteLinkAttr.DataContent,\n ),\n };\n },\n priority: builder.Priority.VeryHigh,\n },\n ],\n toDOM(node) {\n return ['blockquote', node.attrs, 0];\n },\n selectable: true,\n selectAll: 'node',\n },\n fromMd: {\n tokenSpec: {\n name: quoteLinkNodeName,\n type: 'block',\n getAttrs: (tok) => ({\n [QuoteLinkAttr.Cite]: tok.attrGet('cite'),\n [QuoteLinkAttr.DataContent]: tok.attrGet('data-content') || null,\n }),\n },\n },\n toMd: (state, node) => {\n state.wrapBlock('> ', null, node, () => {\n state.write(\n `[${node.attrs[QuoteLinkAttr.DataContent]}](${\n node.attrs[QuoteLinkAttr.Cite]\n }){data-quotelink=true}`,\n );\n state.write('\\n');\n state.write('\\n');\n state.renderContent(node);\n });\n },\n }));\n};\n"]}
@@ -10,6 +10,7 @@ const helpers_1 = require("../../../utils/helpers.js");
10
10
  const selection_1 = require("../../../utils/selection.js");
11
11
  const BaseSchema_1 = require("../../base/BaseSchema/index.js");
12
12
  const code_1 = require("./code.js");
13
+ const selection_content_1 = require("./selection-content.js");
13
14
  const trim_selection_1 = require("./trim-selection.js");
14
15
  const utils_1 = require("./utils.js");
15
16
  const clipboard = ({ logger, textParser, mdParser, serializer, pasteFileHandler, }) => {
@@ -224,7 +225,7 @@ function getCopyContent(state) {
224
225
  if (isTextSelectionWithinSameTextBlock(sel)) {
225
226
  return new model_1.Slice(createFragmentFromInlineSelection(state, sel), 0, 0);
226
227
  }
227
- let slice = getSelectionContent(sel);
228
+ let slice = (0, selection_content_1.getSelectionContent)(sel);
228
229
  // replace first node with paragraph if needed
229
230
  if (slice.content.firstChild?.isTextblock &&
230
231
  slice.content.firstChild.type.name !== BaseSchema_1.BaseNode.Paragraph) {
@@ -262,18 +263,6 @@ function createFragmentFromInlineSelection(state, sel) {
262
263
  }
263
264
  return model_1.Fragment.from(sel.$from.parent.copy(inlineSlice.content));
264
265
  }
265
- /**
266
- * Like `selection.content()`, but smarter.
267
- * Copy a structure of complex nodes,
268
- * e.g. if select part of cut title it creates slice with yfm-cut –> yfm-cut-title -> selected text
269
- * it works well with simple nodes, but to handle cases as described above, custom logic needed
270
- */
271
- function getSelectionContent(sel) {
272
- const sharedNodeType = getSharedDepthNode(sel).type;
273
- const sharedNodeComplex = sharedNodeType.spec.complex;
274
- const includeParents = sharedNodeComplex && sharedNodeComplex !== 'leaf';
275
- return sel.$from.doc.slice(sel.$from.pos, sel.to, includeParents);
276
- }
277
266
  function getSharedDepthNode({ $from, $to }) {
278
267
  return $from.node($from.sharedDepth($to.pos));
279
268
  }
@@ -1 +1 @@
1
- {"version":3,"file":"clipboard.js","sourceRoot":"../../../../../src","sources":["extensions/behavior/Clipboard/clipboard.ts"],"names":[],"mappings":"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","sourcesContent":["import {type Parser, type Serializer, trackTransactionMetrics} from '#core';\nimport {Fragment, type Node, type ResolvedPos, type Schema, Slice} from '#pm/model';\nimport {type EditorState, Plugin, type Selection} from '#pm/state';\nimport type {EditorView} from '#pm/view';\nimport {type Logger2, globalLogger} from 'src/logger';\nimport 'src/types/spec';\nimport {tryCatch} from 'src/utils/helpers';\nimport {isNodeSelection, isTextSelection, isWholeSelection} from 'src/utils/selection';\n\nimport {BaseNode, pType} from '../../base/BaseSchema';\n\nimport {isInsideCode} from './code';\nimport {trimTextSelection} from './trim-selection';\nimport {DataTransferType, extractTextContentFromHtml, isIosSafariShare, trimContent} from './utils';\n\nexport type ClipboardPluginOptions = {\n logger: Logger2.ILogger;\n mdParser: Parser;\n textParser: Parser;\n serializer: Serializer;\n pasteFileHandler?: (file: File) => void;\n};\n\nexport const clipboard = ({\n logger,\n textParser,\n mdParser,\n serializer,\n pasteFileHandler,\n}: ClipboardPluginOptions) => {\n return new Plugin({\n props: {\n handleDOMEvents: {\n copy(view, e) {\n if (!e.clipboardData) return false;\n const result = serializeSelected(view, serializer);\n if (result) {\n e.preventDefault();\n setClipboardData(e.clipboardData, result);\n return true;\n }\n return false;\n },\n cut(view, e) {\n if (!e.clipboardData) return false;\n const result = serializeSelected(view, serializer);\n if (result) {\n e.preventDefault();\n setClipboardData(e.clipboardData, result);\n view.dispatch(\n view.state.tr\n .deleteSelection()\n .scrollIntoView()\n .setMeta('uiEvent', 'cut'),\n );\n return true;\n }\n return false;\n },\n paste(view, e) {\n if (!e.clipboardData) return false;\n\n const pasteLogger = logger.nested({\n domEvent: 'paste',\n dataTypes: e.clipboardData.types,\n });\n\n let data: string;\n let isPasteHandled = false;\n\n if (\n isIosSafariShare(e.clipboardData) &&\n (data = e.clipboardData.getData(DataTransferType.UriList))\n ) {\n const schema: Schema = view.state.schema;\n view.dispatch(\n trackTransactionMetrics(\n view.state.tr.replaceSelection(\n // paste link inline\n new Slice(\n Fragment.from(\n pType(schema).create(null, schema.text(data)),\n ),\n 1,\n 1,\n ),\n ),\n 'paste',\n {clipboardDataFormat: DataTransferType.UriList},\n ),\n );\n pasteLogger.event({\n event: 'paste-uri-list',\n });\n isPasteHandled = true;\n e.preventDefault();\n return true;\n }\n\n if (\n !e.clipboardData.types.includes(DataTransferType.Yfm) &&\n (data = e.clipboardData.getData(DataTransferType.Html))\n ) {\n const textFromHtml = extractTextContentFromHtml(data);\n if (textFromHtml) {\n const res = tryCatch(() => textParser.parse(textFromHtml));\n if (res.success) {\n const docNode = res.result;\n const slice = getSliceFromMarkupFragment(docNode.content);\n view.dispatch(\n trackTransactionMetrics(\n view.state.tr.replaceSelection(slice),\n 'paste',\n {clipboardDataFormat: DataTransferType.Html},\n ),\n );\n pasteLogger.event({\n event: 'paste-parsed-html',\n });\n isPasteHandled = true;\n } else {\n globalLogger.error(res.error);\n pasteLogger.error(res.error, {\n event: 'parse-html',\n });\n console.error(res.error);\n }\n } else return false; // default html pasting\n }\n\n if (\n !isPasteHandled &&\n ((data = e.clipboardData.getData(DataTransferType.Yfm)) ||\n (data = e.clipboardData.getData(DataTransferType.Text)))\n ) {\n let parser: Parser;\n let dataFormat: string;\n if (e.clipboardData.types.includes(DataTransferType.Yfm)) {\n parser = mdParser;\n dataFormat = DataTransferType.Yfm;\n } else {\n parser = textParser;\n dataFormat = DataTransferType.Text;\n }\n const codeType = isInsideCode(view.state);\n if (codeType) {\n const schema: Schema = view.state.schema;\n const insideCodeData = e.clipboardData.getData(DataTransferType.Text);\n\n pasteLogger.event({\n event: 'paste-text-to-code',\n codeType,\n });\n view.dispatch(\n trackTransactionMetrics(\n view.state.tr.replaceSelectionWith(\n schema.text(\n codeType === 'inline'\n ? insideCodeData.trim()\n : insideCodeData,\n ),\n ),\n 'paste',\n {clipboardDataFormat: DataTransferType.Text, code: codeType},\n ),\n );\n isPasteHandled = true;\n } else {\n const res = tryCatch(() => parser.parse(data));\n if (res.success) {\n const docNode = res.result;\n const slice = getSliceFromMarkupFragment(docNode.content);\n pasteLogger.event({\n event: 'paste-parsed-content',\n dataFormat,\n });\n view.dispatch(\n trackTransactionMetrics(\n view.state.tr.replaceSelection(slice),\n 'paste',\n {clipboardDataFormat: dataFormat},\n ),\n );\n isPasteHandled = true;\n } else {\n globalLogger.error(res.error);\n pasteLogger.error(res.error, {\n event: 'paste',\n dataFormat,\n });\n console.error(res.error);\n }\n }\n }\n\n if (e.clipboardData.files.length && pasteFileHandler) {\n pasteLogger.event({\n event: 'paste-files',\n });\n for (const file of Array.from(e.clipboardData.files)) {\n pasteFileHandler(file);\n }\n isPasteHandled = true;\n }\n\n if (isPasteHandled) {\n e.preventDefault();\n return true;\n }\n\n return false;\n },\n },\n },\n });\n};\n\nfunction getSliceFromMarkupFragment(fragment: Fragment) {\n let start = 0;\n let end = 0;\n if (fragment.firstChild?.isTextblock) {\n start = 1;\n if (fragment.childCount === 1) {\n end = 1;\n }\n }\n return new Slice(fragment, start, end);\n}\n\ntype SerializeResult = {\n text: string;\n html?: string;\n markup?: string;\n};\nfunction serializeSelected(view: EditorView, serializer: Serializer): SerializeResult | null {\n const sel = view.state.selection;\n\n if (sel.empty) return null;\n\n // handle selection in codeblocks\n if (getSharedDepthNode(sel).type.spec.code) {\n const fragment = sel.content().content;\n return {text: fragment.textBetween(0, fragment.size)};\n }\n\n // FIXME: Verify and use Node instead of Fragment\n const markup = serializer.serialize(getCopyContent(view.state).content as any);\n const {dom, text} = view.serializeForClipboard(sel.content());\n return {markup, text, html: dom.innerHTML};\n}\n\nfunction setClipboardData(data: DataTransfer, result: SerializeResult) {\n data.clearData();\n if (typeof result.markup === 'string') data.setData(DataTransferType.Yfm, result.markup);\n if (typeof result.html === 'string') data.setData(DataTransferType.Html, result.html);\n data.setData(DataTransferType.Text, result.text);\n}\n\nfunction getCopyContent(state: EditorState): Slice {\n let sel = state.selection;\n\n if (isWholeSelection(sel)) {\n return new Slice(state.doc.content, 0, 0);\n }\n\n if (isNodeSelection(sel)) {\n const {node} = sel;\n if (node.type.spec.complex) {\n if (node.isTextblock) {\n return new Slice(\n Fragment.from(state.schema.node(BaseNode.Paragraph, {}, node.content)),\n 1,\n 1,\n );\n } else {\n const {complex} = node.type.spec;\n if (complex === 'root') {\n return new Slice(Fragment.from(node), 1, 1);\n } else if (complex === 'leaf') {\n return new Slice(Fragment.from(node.content), 1, 1);\n } else {\n // TODO: handle copy of intermediate complex block node\n }\n }\n } else {\n return new Slice(Fragment.from(node), 1, 1);\n }\n }\n\n if (isTextSelection(sel)) {\n sel = trimTextSelection(sel);\n }\n\n if (isTextSelectionWithinSameTextBlock(sel)) {\n return new Slice(createFragmentFromInlineSelection(state, sel), 0, 0);\n }\n\n let slice = getSelectionContent(sel);\n\n // replace first node with paragraph if needed\n if (\n slice.content.firstChild?.isTextblock &&\n slice.content.firstChild.type.name !== BaseNode.Paragraph\n ) {\n let shouldTransformFirstChildToPara = true;\n const {firstChild} = slice.content;\n\n // if all text selected inside first node, don't replace it with paragraph\n if (firstChild.eq(sel.$from.parent)) {\n shouldTransformFirstChildToPara = false;\n }\n\n if (shouldTransformFirstChildToPara) {\n slice = new Slice(\n slice.content.replaceChild(\n 0,\n state.schema.node(BaseNode.Paragraph, {}, firstChild.content),\n ),\n slice.openStart,\n slice.openStart,\n );\n }\n } else {\n // trim empty list items\n const createEmptyParagraph = () => Fragment.from(pType(state.schema).createAndFill());\n const trimmedContent = trimContent(slice.content, createEmptyParagraph);\n if (trimmedContent !== slice.content) {\n slice = new Slice(trimmedContent, 1, 1);\n }\n }\n\n return slice;\n}\n\nfunction isTextSelectionWithinSameTextBlock(sel: Selection) {\n return isTextSelection(sel) && sel.$from.sameParent(sel.$to) && sel.$from.parent.isTextblock;\n}\n\nfunction createFragmentFromInlineSelection(state: EditorState, sel: Selection) {\n const inlineSlice = state.doc.slice(sel.from, sel.to);\n const isComplexTextblock = Boolean(sel.$from.parent.type.spec.complex);\n const isAllContentSelected = sel.$from.parent.content.eq(inlineSlice.content);\n if (isComplexTextblock || !isAllContentSelected) {\n // copy selected inline content to paragraph if current node is complex\n // or if only part of it's content was selected\n return Fragment.from(state.schema.node(BaseNode.Paragraph, {}, inlineSlice.content));\n }\n return Fragment.from(sel.$from.parent.copy(inlineSlice.content));\n}\n\n/**\n * Like `selection.content()`, but smarter.\n * Copy a structure of complex nodes,\n * e.g. if select part of cut title it creates slice with yfm-cut –> yfm-cut-title -> selected text\n * it works well with simple nodes, but to handle cases as described above, custom logic needed\n */\nfunction getSelectionContent(sel: Selection) {\n const sharedNodeType = getSharedDepthNode(sel).type;\n const sharedNodeComplex = sharedNodeType.spec.complex;\n const includeParents = sharedNodeComplex && sharedNodeComplex !== 'leaf';\n return sel.$from.doc.slice(sel.$from.pos, sel.to, includeParents);\n}\n\nfunction getSharedDepthNode({$from, $to}: {$from: ResolvedPos; $to: ResolvedPos}): Node {\n return $from.node($from.sharedDepth($to.pos));\n}\n"]}
1
+ {"version":3,"file":"clipboard.js","sourceRoot":"../../../../../src","sources":["extensions/behavior/Clipboard/clipboard.ts"],"names":[],"mappings":"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","sourcesContent":["import {type Parser, type Serializer, trackTransactionMetrics} from '#core';\nimport {Fragment, type Node, type ResolvedPos, type Schema, Slice} from '#pm/model';\nimport {type EditorState, Plugin, type Selection} from '#pm/state';\nimport type {EditorView} from '#pm/view';\nimport {type Logger2, globalLogger} from 'src/logger';\nimport 'src/types/spec';\nimport {tryCatch} from 'src/utils/helpers';\nimport {isNodeSelection, isTextSelection, isWholeSelection} from 'src/utils/selection';\n\nimport {BaseNode, pType} from '../../base/BaseSchema';\n\nimport {isInsideCode} from './code';\nimport {getSelectionContent} from './selection-content';\nimport {trimTextSelection} from './trim-selection';\nimport {DataTransferType, extractTextContentFromHtml, isIosSafariShare, trimContent} from './utils';\n\nexport type ClipboardPluginOptions = {\n logger: Logger2.ILogger;\n mdParser: Parser;\n textParser: Parser;\n serializer: Serializer;\n pasteFileHandler?: (file: File) => void;\n};\n\nexport const clipboard = ({\n logger,\n textParser,\n mdParser,\n serializer,\n pasteFileHandler,\n}: ClipboardPluginOptions) => {\n return new Plugin({\n props: {\n handleDOMEvents: {\n copy(view, e) {\n if (!e.clipboardData) return false;\n const result = serializeSelected(view, serializer);\n if (result) {\n e.preventDefault();\n setClipboardData(e.clipboardData, result);\n return true;\n }\n return false;\n },\n cut(view, e) {\n if (!e.clipboardData) return false;\n const result = serializeSelected(view, serializer);\n if (result) {\n e.preventDefault();\n setClipboardData(e.clipboardData, result);\n view.dispatch(\n view.state.tr\n .deleteSelection()\n .scrollIntoView()\n .setMeta('uiEvent', 'cut'),\n );\n return true;\n }\n return false;\n },\n paste(view, e) {\n if (!e.clipboardData) return false;\n\n const pasteLogger = logger.nested({\n domEvent: 'paste',\n dataTypes: e.clipboardData.types,\n });\n\n let data: string;\n let isPasteHandled = false;\n\n if (\n isIosSafariShare(e.clipboardData) &&\n (data = e.clipboardData.getData(DataTransferType.UriList))\n ) {\n const schema: Schema = view.state.schema;\n view.dispatch(\n trackTransactionMetrics(\n view.state.tr.replaceSelection(\n // paste link inline\n new Slice(\n Fragment.from(\n pType(schema).create(null, schema.text(data)),\n ),\n 1,\n 1,\n ),\n ),\n 'paste',\n {clipboardDataFormat: DataTransferType.UriList},\n ),\n );\n pasteLogger.event({\n event: 'paste-uri-list',\n });\n isPasteHandled = true;\n e.preventDefault();\n return true;\n }\n\n if (\n !e.clipboardData.types.includes(DataTransferType.Yfm) &&\n (data = e.clipboardData.getData(DataTransferType.Html))\n ) {\n const textFromHtml = extractTextContentFromHtml(data);\n if (textFromHtml) {\n const res = tryCatch(() => textParser.parse(textFromHtml));\n if (res.success) {\n const docNode = res.result;\n const slice = getSliceFromMarkupFragment(docNode.content);\n view.dispatch(\n trackTransactionMetrics(\n view.state.tr.replaceSelection(slice),\n 'paste',\n {clipboardDataFormat: DataTransferType.Html},\n ),\n );\n pasteLogger.event({\n event: 'paste-parsed-html',\n });\n isPasteHandled = true;\n } else {\n globalLogger.error(res.error);\n pasteLogger.error(res.error, {\n event: 'parse-html',\n });\n console.error(res.error);\n }\n } else return false; // default html pasting\n }\n\n if (\n !isPasteHandled &&\n ((data = e.clipboardData.getData(DataTransferType.Yfm)) ||\n (data = e.clipboardData.getData(DataTransferType.Text)))\n ) {\n let parser: Parser;\n let dataFormat: string;\n if (e.clipboardData.types.includes(DataTransferType.Yfm)) {\n parser = mdParser;\n dataFormat = DataTransferType.Yfm;\n } else {\n parser = textParser;\n dataFormat = DataTransferType.Text;\n }\n const codeType = isInsideCode(view.state);\n if (codeType) {\n const schema: Schema = view.state.schema;\n const insideCodeData = e.clipboardData.getData(DataTransferType.Text);\n\n pasteLogger.event({\n event: 'paste-text-to-code',\n codeType,\n });\n view.dispatch(\n trackTransactionMetrics(\n view.state.tr.replaceSelectionWith(\n schema.text(\n codeType === 'inline'\n ? insideCodeData.trim()\n : insideCodeData,\n ),\n ),\n 'paste',\n {clipboardDataFormat: DataTransferType.Text, code: codeType},\n ),\n );\n isPasteHandled = true;\n } else {\n const res = tryCatch(() => parser.parse(data));\n if (res.success) {\n const docNode = res.result;\n const slice = getSliceFromMarkupFragment(docNode.content);\n pasteLogger.event({\n event: 'paste-parsed-content',\n dataFormat,\n });\n view.dispatch(\n trackTransactionMetrics(\n view.state.tr.replaceSelection(slice),\n 'paste',\n {clipboardDataFormat: dataFormat},\n ),\n );\n isPasteHandled = true;\n } else {\n globalLogger.error(res.error);\n pasteLogger.error(res.error, {\n event: 'paste',\n dataFormat,\n });\n console.error(res.error);\n }\n }\n }\n\n if (e.clipboardData.files.length && pasteFileHandler) {\n pasteLogger.event({\n event: 'paste-files',\n });\n for (const file of Array.from(e.clipboardData.files)) {\n pasteFileHandler(file);\n }\n isPasteHandled = true;\n }\n\n if (isPasteHandled) {\n e.preventDefault();\n return true;\n }\n\n return false;\n },\n },\n },\n });\n};\n\nfunction getSliceFromMarkupFragment(fragment: Fragment) {\n let start = 0;\n let end = 0;\n if (fragment.firstChild?.isTextblock) {\n start = 1;\n if (fragment.childCount === 1) {\n end = 1;\n }\n }\n return new Slice(fragment, start, end);\n}\n\ntype SerializeResult = {\n text: string;\n html?: string;\n markup?: string;\n};\nfunction serializeSelected(view: EditorView, serializer: Serializer): SerializeResult | null {\n const sel = view.state.selection;\n\n if (sel.empty) return null;\n\n // handle selection in codeblocks\n if (getSharedDepthNode(sel).type.spec.code) {\n const fragment = sel.content().content;\n return {text: fragment.textBetween(0, fragment.size)};\n }\n\n // FIXME: Verify and use Node instead of Fragment\n const markup = serializer.serialize(getCopyContent(view.state).content as any);\n const {dom, text} = view.serializeForClipboard(sel.content());\n return {markup, text, html: dom.innerHTML};\n}\n\nfunction setClipboardData(data: DataTransfer, result: SerializeResult) {\n data.clearData();\n if (typeof result.markup === 'string') data.setData(DataTransferType.Yfm, result.markup);\n if (typeof result.html === 'string') data.setData(DataTransferType.Html, result.html);\n data.setData(DataTransferType.Text, result.text);\n}\n\nfunction getCopyContent(state: EditorState): Slice {\n let sel = state.selection;\n\n if (isWholeSelection(sel)) {\n return new Slice(state.doc.content, 0, 0);\n }\n\n if (isNodeSelection(sel)) {\n const {node} = sel;\n if (node.type.spec.complex) {\n if (node.isTextblock) {\n return new Slice(\n Fragment.from(state.schema.node(BaseNode.Paragraph, {}, node.content)),\n 1,\n 1,\n );\n } else {\n const {complex} = node.type.spec;\n if (complex === 'root') {\n return new Slice(Fragment.from(node), 1, 1);\n } else if (complex === 'leaf') {\n return new Slice(Fragment.from(node.content), 1, 1);\n } else {\n // TODO: handle copy of intermediate complex block node\n }\n }\n } else {\n return new Slice(Fragment.from(node), 1, 1);\n }\n }\n\n if (isTextSelection(sel)) {\n sel = trimTextSelection(sel);\n }\n\n if (isTextSelectionWithinSameTextBlock(sel)) {\n return new Slice(createFragmentFromInlineSelection(state, sel), 0, 0);\n }\n\n let slice = getSelectionContent(sel);\n\n // replace first node with paragraph if needed\n if (\n slice.content.firstChild?.isTextblock &&\n slice.content.firstChild.type.name !== BaseNode.Paragraph\n ) {\n let shouldTransformFirstChildToPara = true;\n const {firstChild} = slice.content;\n\n // if all text selected inside first node, don't replace it with paragraph\n if (firstChild.eq(sel.$from.parent)) {\n shouldTransformFirstChildToPara = false;\n }\n\n if (shouldTransformFirstChildToPara) {\n slice = new Slice(\n slice.content.replaceChild(\n 0,\n state.schema.node(BaseNode.Paragraph, {}, firstChild.content),\n ),\n slice.openStart,\n slice.openStart,\n );\n }\n } else {\n // trim empty list items\n const createEmptyParagraph = () => Fragment.from(pType(state.schema).createAndFill());\n const trimmedContent = trimContent(slice.content, createEmptyParagraph);\n if (trimmedContent !== slice.content) {\n slice = new Slice(trimmedContent, 1, 1);\n }\n }\n\n return slice;\n}\n\nfunction isTextSelectionWithinSameTextBlock(sel: Selection) {\n return isTextSelection(sel) && sel.$from.sameParent(sel.$to) && sel.$from.parent.isTextblock;\n}\n\nfunction createFragmentFromInlineSelection(state: EditorState, sel: Selection) {\n const inlineSlice = state.doc.slice(sel.from, sel.to);\n const isComplexTextblock = Boolean(sel.$from.parent.type.spec.complex);\n const isAllContentSelected = sel.$from.parent.content.eq(inlineSlice.content);\n if (isComplexTextblock || !isAllContentSelected) {\n // copy selected inline content to paragraph if current node is complex\n // or if only part of it's content was selected\n return Fragment.from(state.schema.node(BaseNode.Paragraph, {}, inlineSlice.content));\n }\n return Fragment.from(sel.$from.parent.copy(inlineSlice.content));\n}\n\nfunction getSharedDepthNode({$from, $to}: {$from: ResolvedPos; $to: ResolvedPos}): Node {\n return $from.node($from.sharedDepth($to.pos));\n}\n"]}