@gravity-ui/markdown-editor 14.9.0 → 14.10.1

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 (121) hide show
  1. package/build/cjs/bundle/Editor.d.ts +2 -0
  2. package/build/cjs/bundle/Editor.js +15 -4
  3. package/build/cjs/bundle/MarkdownEditorView.js +2 -2
  4. package/build/cjs/bundle/config/action-names.d.ts +1 -1
  5. package/build/cjs/bundle/config/action-names.js +1 -0
  6. package/build/cjs/bundle/toolbar/utils/flattenPreset.d.ts +2 -0
  7. package/build/cjs/bundle/toolbar/utils/flattenPreset.js +14 -0
  8. package/build/cjs/bundle/toolbar/utils/toolbarsConfigs.d.ts +17 -0
  9. package/build/cjs/bundle/toolbar/{utils.js → utils/toolbarsConfigs.js} +15 -19
  10. package/build/cjs/bundle/types.d.ts +6 -0
  11. package/build/cjs/bundle/useMarkdownEditor.js +8 -2
  12. package/build/cjs/bundle/wysiwyg-preset.d.ts +1 -0
  13. package/build/cjs/bundle/wysiwyg-preset.js +1 -1
  14. package/build/cjs/core/Editor.d.ts +3 -1
  15. package/build/cjs/core/Editor.js +2 -1
  16. package/build/cjs/core/ExtensionsManager.d.ts +2 -0
  17. package/build/cjs/core/ExtensionsManager.js +8 -4
  18. package/build/cjs/core/ParserTokensRegistry.d.ts +2 -1
  19. package/build/cjs/core/ParserTokensRegistry.js +2 -2
  20. package/build/cjs/core/markdown/MarkdownParser.d.ts +3 -1
  21. package/build/cjs/core/markdown/MarkdownParser.js +5 -2
  22. package/build/cjs/core/markdown/MarkdownSerializer.js +1 -1
  23. package/build/cjs/core/markdown/ProseMirrorTransformer/emptyRowTransformer.d.ts +2 -0
  24. package/build/cjs/core/markdown/ProseMirrorTransformer/emptyRowTransformer.js +15 -0
  25. package/build/cjs/core/markdown/ProseMirrorTransformer/getTransformers.d.ts +7 -0
  26. package/build/cjs/core/markdown/ProseMirrorTransformer/getTransformers.js +13 -0
  27. package/build/cjs/core/markdown/ProseMirrorTransformer/index.d.ts +15 -0
  28. package/build/cjs/core/markdown/ProseMirrorTransformer/index.js +25 -0
  29. package/build/cjs/extensions/additional/Math/MathSpecs/index.js +1 -0
  30. package/build/cjs/extensions/base/BaseSchema/BaseSchemaSpecs/index.d.ts +1 -0
  31. package/build/cjs/extensions/base/BaseSchema/BaseSchemaSpecs/index.js +23 -3
  32. package/build/cjs/extensions/behavior/Selection/selection.js +1 -5
  33. package/build/cjs/extensions/markdown/Blockquote/BlockquoteSpecs/index.js +1 -0
  34. package/build/cjs/extensions/markdown/CodeBlock/commands.js +1 -1
  35. package/build/cjs/extensions/markdown/HorizontalRule/HorizontalRuleSpecs/index.js +1 -0
  36. package/build/cjs/extensions/yfm/YfmTabs/YfmTabsSpecs/schema.js +1 -0
  37. package/build/cjs/i18n/empty-row/en.json +3 -0
  38. package/build/cjs/i18n/empty-row/index.d.ts +5 -0
  39. package/build/cjs/i18n/empty-row/index.js +9 -0
  40. package/build/cjs/i18n/empty-row/ru.json +3 -0
  41. package/build/cjs/i18n/yfm-note/index.d.ts +1 -1
  42. package/build/cjs/index.d.ts +1 -0
  43. package/build/cjs/index.js +1 -0
  44. package/build/cjs/markup/codemirror/autocomplete/emptyRow.d.ts +9 -0
  45. package/build/cjs/markup/codemirror/autocomplete/emptyRow.js +26 -0
  46. package/build/cjs/markup/codemirror/autocomplete/index.d.ts +5 -0
  47. package/build/cjs/markup/codemirror/autocomplete/index.js +14 -0
  48. package/build/cjs/markup/codemirror/create.d.ts +1 -0
  49. package/build/cjs/markup/codemirror/create.js +6 -1
  50. package/build/cjs/markup/codemirror/yfm.d.ts +2 -1
  51. package/build/cjs/markup/codemirror/yfm.js +3 -3
  52. package/build/cjs/markup/commands/emptyRow.d.ts +2 -0
  53. package/build/cjs/markup/commands/emptyRow.js +43 -0
  54. package/build/cjs/markup/commands/index.d.ts +1 -0
  55. package/build/cjs/markup/commands/index.js +1 -0
  56. package/build/cjs/shortcuts/const.d.ts +1 -0
  57. package/build/cjs/shortcuts/const.js +1 -0
  58. package/build/cjs/shortcuts/default.js +1 -0
  59. package/build/cjs/version.js +1 -1
  60. package/build/esm/bundle/Editor.d.ts +2 -0
  61. package/build/esm/bundle/Editor.js +15 -4
  62. package/build/esm/bundle/MarkdownEditorView.js +1 -1
  63. package/build/esm/bundle/config/action-names.d.ts +1 -1
  64. package/build/esm/bundle/config/action-names.js +1 -0
  65. package/build/esm/bundle/toolbar/utils/flattenPreset.d.ts +2 -0
  66. package/build/esm/bundle/toolbar/utils/flattenPreset.js +10 -0
  67. package/build/esm/bundle/toolbar/utils/toolbarsConfigs.d.ts +17 -0
  68. package/build/esm/bundle/toolbar/{utils.js → utils/toolbarsConfigs.js} +13 -17
  69. package/build/esm/bundle/types.d.ts +6 -0
  70. package/build/esm/bundle/useMarkdownEditor.js +8 -2
  71. package/build/esm/bundle/wysiwyg-preset.d.ts +1 -0
  72. package/build/esm/bundle/wysiwyg-preset.js +1 -1
  73. package/build/esm/core/Editor.d.ts +3 -1
  74. package/build/esm/core/Editor.js +2 -1
  75. package/build/esm/core/ExtensionsManager.d.ts +2 -0
  76. package/build/esm/core/ExtensionsManager.js +8 -4
  77. package/build/esm/core/ParserTokensRegistry.d.ts +2 -1
  78. package/build/esm/core/ParserTokensRegistry.js +2 -2
  79. package/build/esm/core/markdown/MarkdownParser.d.ts +3 -1
  80. package/build/esm/core/markdown/MarkdownParser.js +5 -2
  81. package/build/esm/core/markdown/MarkdownSerializer.js +1 -1
  82. package/build/esm/core/markdown/ProseMirrorTransformer/emptyRowTransformer.d.ts +2 -0
  83. package/build/esm/core/markdown/ProseMirrorTransformer/emptyRowTransformer.js +11 -0
  84. package/build/esm/core/markdown/ProseMirrorTransformer/getTransformers.d.ts +7 -0
  85. package/build/esm/core/markdown/ProseMirrorTransformer/getTransformers.js +9 -0
  86. package/build/esm/core/markdown/ProseMirrorTransformer/index.d.ts +15 -0
  87. package/build/esm/core/markdown/ProseMirrorTransformer/index.js +21 -0
  88. package/build/esm/extensions/additional/Math/MathSpecs/index.js +1 -0
  89. package/build/esm/extensions/base/BaseSchema/BaseSchemaSpecs/index.d.ts +1 -0
  90. package/build/esm/extensions/base/BaseSchema/BaseSchemaSpecs/index.js +23 -3
  91. package/build/esm/extensions/behavior/Selection/selection.js +1 -5
  92. package/build/esm/extensions/markdown/Blockquote/BlockquoteSpecs/index.js +1 -0
  93. package/build/esm/extensions/markdown/CodeBlock/commands.js +1 -1
  94. package/build/esm/extensions/markdown/HorizontalRule/HorizontalRuleSpecs/index.js +1 -0
  95. package/build/esm/extensions/yfm/YfmTabs/YfmTabsSpecs/schema.js +1 -0
  96. package/build/esm/i18n/empty-row/en.json +3 -0
  97. package/build/esm/i18n/empty-row/index.d.ts +5 -0
  98. package/build/esm/i18n/empty-row/index.js +5 -0
  99. package/build/esm/i18n/empty-row/ru.json +3 -0
  100. package/build/esm/i18n/yfm-note/index.d.ts +1 -1
  101. package/build/esm/index.d.ts +1 -0
  102. package/build/esm/index.js +1 -0
  103. package/build/esm/markup/codemirror/autocomplete/emptyRow.d.ts +9 -0
  104. package/build/esm/markup/codemirror/autocomplete/emptyRow.js +23 -0
  105. package/build/esm/markup/codemirror/autocomplete/index.d.ts +5 -0
  106. package/build/esm/markup/codemirror/autocomplete/index.js +10 -0
  107. package/build/esm/markup/codemirror/create.d.ts +1 -0
  108. package/build/esm/markup/codemirror/create.js +7 -2
  109. package/build/esm/markup/codemirror/yfm.d.ts +2 -1
  110. package/build/esm/markup/codemirror/yfm.js +1 -1
  111. package/build/esm/markup/commands/emptyRow.d.ts +2 -0
  112. package/build/esm/markup/commands/emptyRow.js +39 -0
  113. package/build/esm/markup/commands/index.d.ts +1 -0
  114. package/build/esm/markup/commands/index.js +1 -0
  115. package/build/esm/shortcuts/const.d.ts +1 -0
  116. package/build/esm/shortcuts/const.js +1 -0
  117. package/build/esm/shortcuts/default.js +1 -0
  118. package/build/esm/version.js +1 -1
  119. package/package.json +1 -1
  120. package/build/cjs/bundle/toolbar/utils.d.ts +0 -17
  121. package/build/esm/bundle/toolbar/utils.d.ts +0 -17
@@ -1,4 +1,5 @@
1
1
  import type { CommonEditor } from '../common';
2
+ import { TransformFn } from '../core/markdown/ProseMirrorTransformer';
2
3
  import { ReactRenderStorage } from '../extensions';
3
4
  import { type Receiver } from '../utils';
4
5
  import type { DirectiveSyntaxContext } from '../utils/directive';
@@ -43,5 +44,6 @@ export declare type EditorOptions = Pick<MarkdownEditorOptions, 'md' | 'initial'
43
44
  renderStorage: ReactRenderStorage;
44
45
  preset: EditorPreset;
45
46
  directiveSyntax: DirectiveSyntaxContext;
47
+ pmTransformers: TransformFn[];
46
48
  };
47
49
  export {};
@@ -1,5 +1,5 @@
1
1
  "use strict";
2
- var _EditorImpl_markup, _EditorImpl_editorMode, _EditorImpl_toolbarVisible, _EditorImpl_splitModeEnabled, _EditorImpl_splitMode, _EditorImpl_renderPreview, _EditorImpl_wysiwygEditor, _EditorImpl_markupEditor, _EditorImpl_markupConfig, _EditorImpl_escapeConfig, _EditorImpl_mdOptions, _EditorImpl_preset, _EditorImpl_extensions, _EditorImpl_renderStorage, _EditorImpl_fileUploadHandler, _EditorImpl_parseInsertedUrlAsImage, _EditorImpl_needToSetDimensionsForUploadedImages, _EditorImpl_enableNewImageSizeCalculation, _EditorImpl_directiveSyntax, _EditorImpl_prepareRawMarkup, _EditorImpl_beforeEditorModeChange;
2
+ var _EditorImpl_markup, _EditorImpl_editorMode, _EditorImpl_toolbarVisible, _EditorImpl_splitModeEnabled, _EditorImpl_splitMode, _EditorImpl_renderPreview, _EditorImpl_wysiwygEditor, _EditorImpl_markupEditor, _EditorImpl_markupConfig, _EditorImpl_escapeConfig, _EditorImpl_mdOptions, _EditorImpl_pmTransformers, _EditorImpl_preserveEmptyRows, _EditorImpl_preset, _EditorImpl_extensions, _EditorImpl_renderStorage, _EditorImpl_fileUploadHandler, _EditorImpl_parseInsertedUrlAsImage, _EditorImpl_needToSetDimensionsForUploadedImages, _EditorImpl_enableNewImageSizeCalculation, _EditorImpl_directiveSyntax, _EditorImpl_prepareRawMarkup, _EditorImpl_beforeEditorModeChange;
3
3
  Object.defineProperty(exports, "__esModule", { value: true });
4
4
  exports.EditorImpl = void 0;
5
5
  const tslib_1 = require("tslib");
@@ -9,6 +9,7 @@ const core_1 = require("../core");
9
9
  const bundle_1 = require("../i18n/bundle");
10
10
  const logger_1 = require("../logger");
11
11
  const markup_1 = require("../markup");
12
+ const autocomplete_1 = require("../markup/codemirror/autocomplete");
12
13
  const editor_1 = require("../markup/editor");
13
14
  const utils_1 = require("../utils");
14
15
  /** @internal */
@@ -27,6 +28,8 @@ class EditorImpl extends utils_1.SafeEventEmitter {
27
28
  _EditorImpl_markupConfig.set(this, void 0);
28
29
  _EditorImpl_escapeConfig.set(this, void 0);
29
30
  _EditorImpl_mdOptions.set(this, void 0);
31
+ _EditorImpl_pmTransformers.set(this, []);
32
+ _EditorImpl_preserveEmptyRows.set(this, void 0);
30
33
  _EditorImpl_preset.set(this, void 0);
31
34
  _EditorImpl_extensions.set(this, void 0);
32
35
  _EditorImpl_renderStorage.set(this, void 0);
@@ -46,6 +49,7 @@ class EditorImpl extends utils_1.SafeEventEmitter {
46
49
  tslib_1.__classPrivateFieldSet(this, _EditorImpl_renderPreview, markupConfig.renderPreview, "f");
47
50
  tslib_1.__classPrivateFieldSet(this, _EditorImpl_markup, (_e = initial.markup) !== null && _e !== void 0 ? _e : '', "f");
48
51
  tslib_1.__classPrivateFieldSet(this, _EditorImpl_preset, (_f = opts.preset) !== null && _f !== void 0 ? _f : 'full', "f");
52
+ tslib_1.__classPrivateFieldSet(this, _EditorImpl_pmTransformers, opts.pmTransformers, "f");
49
53
  tslib_1.__classPrivateFieldSet(this, _EditorImpl_mdOptions, md, "f");
50
54
  tslib_1.__classPrivateFieldSet(this, _EditorImpl_extensions, wysiwygConfig.extensions, "f");
51
55
  tslib_1.__classPrivateFieldSet(this, _EditorImpl_markupConfig, Object.assign({}, opts.markupConfig), "f");
@@ -55,6 +59,7 @@ class EditorImpl extends utils_1.SafeEventEmitter {
55
59
  tslib_1.__classPrivateFieldSet(this, _EditorImpl_needToSetDimensionsForUploadedImages, Boolean(experimental.needToSetDimensionsForUploadedImages), "f");
56
60
  tslib_1.__classPrivateFieldSet(this, _EditorImpl_directiveSyntax, opts.directiveSyntax, "f");
57
61
  tslib_1.__classPrivateFieldSet(this, _EditorImpl_enableNewImageSizeCalculation, Boolean(experimental.enableNewImageSizeCalculation), "f");
62
+ tslib_1.__classPrivateFieldSet(this, _EditorImpl_preserveEmptyRows, experimental.preserveEmptyRows || false, "f");
58
63
  tslib_1.__classPrivateFieldSet(this, _EditorImpl_prepareRawMarkup, experimental.prepareRawMarkup, "f");
59
64
  tslib_1.__classPrivateFieldSet(this, _EditorImpl_escapeConfig, wysiwygConfig.escapeConfig, "f");
60
65
  tslib_1.__classPrivateFieldSet(this, _EditorImpl_beforeEditorModeChange, experimental.beforeEditorModeChange, "f");
@@ -146,6 +151,7 @@ class EditorImpl extends utils_1.SafeEventEmitter {
146
151
  mdPreset,
147
152
  initialContent: tslib_1.__classPrivateFieldGet(this, _EditorImpl_markup, "f"),
148
153
  extensions: tslib_1.__classPrivateFieldGet(this, _EditorImpl_extensions, "f"),
154
+ pmTransformers: tslib_1.__classPrivateFieldGet(this, _EditorImpl_pmTransformers, "f"),
149
155
  allowHTML: tslib_1.__classPrivateFieldGet(this, _EditorImpl_mdOptions, "f").html,
150
156
  linkify: tslib_1.__classPrivateFieldGet(this, _EditorImpl_mdOptions, "f").linkify,
151
157
  linkifyTlds: tslib_1.__classPrivateFieldGet(this, _EditorImpl_mdOptions, "f").linkifyTlds,
@@ -157,7 +163,7 @@ class EditorImpl extends utils_1.SafeEventEmitter {
157
163
  return tslib_1.__classPrivateFieldGet(this, _EditorImpl_wysiwygEditor, "f");
158
164
  }
159
165
  get markupEditor() {
160
- var _a;
166
+ var _a, _b;
161
167
  if (!tslib_1.__classPrivateFieldGet(this, _EditorImpl_markupEditor, "f")) {
162
168
  tslib_1.__classPrivateFieldSet(this, _EditorImpl_markupEditor, new editor_1.Editor((0, markup_1.createCodemirror)({
163
169
  doc: tslib_1.__classPrivateFieldGet(this, _EditorImpl_markup, "f"),
@@ -176,7 +182,12 @@ class EditorImpl extends utils_1.SafeEventEmitter {
176
182
  extensions: tslib_1.__classPrivateFieldGet(this, _EditorImpl_markupConfig, "f").extensions,
177
183
  disabledExtensions: tslib_1.__classPrivateFieldGet(this, _EditorImpl_markupConfig, "f").disabledExtensions,
178
184
  keymaps: tslib_1.__classPrivateFieldGet(this, _EditorImpl_markupConfig, "f").keymaps,
179
- yfmLangOptions: { languageData: tslib_1.__classPrivateFieldGet(this, _EditorImpl_markupConfig, "f").languageData },
185
+ preserveEmptyRows: tslib_1.__classPrivateFieldGet(this, _EditorImpl_preserveEmptyRows, "f"),
186
+ yfmLangOptions: {
187
+ languageData: (0, autocomplete_1.getAutocompleteConfig)({
188
+ preserveEmptyRows: tslib_1.__classPrivateFieldGet(this, _EditorImpl_preserveEmptyRows, "f"),
189
+ }).concat(((_b = tslib_1.__classPrivateFieldGet(this, _EditorImpl_markupConfig, "f")) === null || _b === void 0 ? void 0 : _b.languageData) || []),
190
+ },
180
191
  autocompletion: tslib_1.__classPrivateFieldGet(this, _EditorImpl_markupConfig, "f").autocompletion,
181
192
  directiveSyntax: this.directiveSyntax,
182
193
  receiver: this,
@@ -319,7 +330,7 @@ class EditorImpl extends utils_1.SafeEventEmitter {
319
330
  }
320
331
  }
321
332
  exports.EditorImpl = EditorImpl;
322
- _EditorImpl_markup = new WeakMap(), _EditorImpl_editorMode = new WeakMap(), _EditorImpl_toolbarVisible = new WeakMap(), _EditorImpl_splitModeEnabled = new WeakMap(), _EditorImpl_splitMode = new WeakMap(), _EditorImpl_renderPreview = new WeakMap(), _EditorImpl_wysiwygEditor = new WeakMap(), _EditorImpl_markupEditor = new WeakMap(), _EditorImpl_markupConfig = new WeakMap(), _EditorImpl_escapeConfig = new WeakMap(), _EditorImpl_mdOptions = new WeakMap(), _EditorImpl_preset = new WeakMap(), _EditorImpl_extensions = new WeakMap(), _EditorImpl_renderStorage = new WeakMap(), _EditorImpl_fileUploadHandler = new WeakMap(), _EditorImpl_parseInsertedUrlAsImage = new WeakMap(), _EditorImpl_needToSetDimensionsForUploadedImages = new WeakMap(), _EditorImpl_enableNewImageSizeCalculation = new WeakMap(), _EditorImpl_directiveSyntax = new WeakMap(), _EditorImpl_prepareRawMarkup = new WeakMap(), _EditorImpl_beforeEditorModeChange = new WeakMap();
333
+ _EditorImpl_markup = new WeakMap(), _EditorImpl_editorMode = new WeakMap(), _EditorImpl_toolbarVisible = new WeakMap(), _EditorImpl_splitModeEnabled = new WeakMap(), _EditorImpl_splitMode = new WeakMap(), _EditorImpl_renderPreview = new WeakMap(), _EditorImpl_wysiwygEditor = new WeakMap(), _EditorImpl_markupEditor = new WeakMap(), _EditorImpl_markupConfig = new WeakMap(), _EditorImpl_escapeConfig = new WeakMap(), _EditorImpl_mdOptions = new WeakMap(), _EditorImpl_pmTransformers = new WeakMap(), _EditorImpl_preserveEmptyRows = new WeakMap(), _EditorImpl_preset = new WeakMap(), _EditorImpl_extensions = new WeakMap(), _EditorImpl_renderStorage = new WeakMap(), _EditorImpl_fileUploadHandler = new WeakMap(), _EditorImpl_parseInsertedUrlAsImage = new WeakMap(), _EditorImpl_needToSetDimensionsForUploadedImages = new WeakMap(), _EditorImpl_enableNewImageSizeCalculation = new WeakMap(), _EditorImpl_directiveSyntax = new WeakMap(), _EditorImpl_prepareRawMarkup = new WeakMap(), _EditorImpl_beforeEditorModeChange = new WeakMap();
323
334
  function getTopOffset(elem) {
324
335
  const TOOLBAR_HEIGHT = 36; //px
325
336
  const TOOLBAR_BOTTOM_OFFSET = 8; // px
@@ -17,7 +17,7 @@ const WysiwygEditorView_1 = require("./WysiwygEditorView");
17
17
  const context_1 = require("./context");
18
18
  const settings_1 = require("./settings");
19
19
  const sticky_1 = require("./sticky");
20
- const utils_2 = require("./toolbar/utils");
20
+ const toolbarsConfigs_1 = require("./toolbar/utils/toolbarsConfigs");
21
21
  // eslint-disable-line import/order
22
22
  exports.cnEditorComponent = (0, classname_1.cn)('editor-component');
23
23
  const b = exports.cnEditorComponent;
@@ -34,7 +34,7 @@ exports.MarkdownEditorView = react_1.default.forwardRef((props, ref) => {
34
34
  if (!editor)
35
35
  throw new Error('[MarkdownEditorView]: an instance of the editor must be passed through the props or context');
36
36
  const { autofocus, className, settingsVisible = true, toolbarsPreset, toaster, stickyToolbar, wysiwygToolbarConfig: initialWysiwygToolbarConfig, markupToolbarConfig: initialMarkupToolbarConfig, wysiwygHiddenActionsConfig: initialWysiwygHiddenActionsConfig, markupHiddenActionsConfig: initialMarkupHiddenActionsConfig, enableSubmitInPreview = true, hidePreviewAfterSubmit = false, } = props;
37
- const { wysiwygToolbarConfig, markupToolbarConfig, wysiwygHiddenActionsConfig, markupHiddenActionsConfig, } = (0, react_1.useMemo)(() => (0, utils_2.getToolbarsConfigs)({
37
+ const { wysiwygToolbarConfig, markupToolbarConfig, wysiwygHiddenActionsConfig, markupHiddenActionsConfig, } = (0, react_1.useMemo)(() => (0, toolbarsConfigs_1.getToolbarsConfigs)({
38
38
  toolbarsPreset,
39
39
  props: {
40
40
  wysiwygToolbarConfig: initialWysiwygToolbarConfig,
@@ -1,3 +1,3 @@
1
- declare const namesObj: Record<"bold" | "colorify" | "mono" | "link" | "italic" | "strike" | "underline" | "mark" | "quote" | "block" | "paragraph" | "cut" | "anchor" | "table" | "image" | "code_inline" | "code_block" | "note" | "file" | "codeBlock" | "checkbox" | "emoji" | "bulletList" | "codeInline" | "filePopup" | "gpt" | "heading1" | "heading2" | "heading3" | "heading4" | "heading5" | "heading6" | "horizontalrule" | "horizontalRule" | "imagePopup" | "liftListItem" | "math_block" | "mathBlock" | "math_inline" | "mathInline" | "mermaid" | "orderedList" | "redo" | "sinkListItem" | "tabs" | "undo" | "yfm_block" | "yfm_cut" | "yfm_html_block" | "htmlBlock" | "yfm_layout" | "layout" | "yfm_note", string>;
1
+ declare const namesObj: Record<"bold" | "colorify" | "mono" | "link" | "italic" | "strike" | "underline" | "mark" | "quote" | "block" | "paragraph" | "cut" | "anchor" | "table" | "image" | "code_inline" | "code_block" | "note" | "file" | "codeBlock" | "checkbox" | "emoji" | "bulletList" | "codeInline" | "filePopup" | "gpt" | "heading1" | "heading2" | "heading3" | "heading4" | "heading5" | "heading6" | "emptyRow" | "horizontalrule" | "horizontalRule" | "imagePopup" | "liftListItem" | "math_block" | "mathBlock" | "math_inline" | "mathInline" | "mermaid" | "orderedList" | "redo" | "sinkListItem" | "tabs" | "undo" | "yfm_block" | "yfm_cut" | "yfm_html_block" | "htmlBlock" | "yfm_layout" | "layout" | "yfm_note", string>;
2
2
  export declare const ActionName: Readonly<typeof namesObj>;
3
3
  export {};
@@ -23,6 +23,7 @@ const names = [
23
23
  'heading4',
24
24
  'heading5',
25
25
  'heading6',
26
+ 'emptyRow',
26
27
  /** @deprecated use horizontalRule */
27
28
  'horizontalrule',
28
29
  'horizontalRule',
@@ -0,0 +1,2 @@
1
+ import type { MToolbarData, MToolbarItemData, WToolbarData, WToolbarItemData } from '../../config';
2
+ export declare const flattenPreset: <T extends MToolbarData | WToolbarData>(config: T) => T extends WToolbarData ? WToolbarItemData[] : MToolbarItemData[];
@@ -0,0 +1,14 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.flattenPreset = void 0;
4
+ const types_1 = require("../../../toolbar/types");
5
+ const flattenPreset = (config) => {
6
+ return config.flat().reduce((acc, item) => {
7
+ if (item.type === types_1.ToolbarDataType.ListButton && Array.isArray(item.data)) {
8
+ return acc.concat(item.data);
9
+ }
10
+ acc.push(item);
11
+ return acc;
12
+ }, []);
13
+ };
14
+ exports.flattenPreset = flattenPreset;
@@ -0,0 +1,17 @@
1
+ import type { ToolbarsPreset } from '../../../modules/toolbars/types';
2
+ import type { MToolbarData, WToolbarData } from '../../../toolbar';
3
+ import type { MarkdownEditorViewProps } from '../../MarkdownEditorView';
4
+ import { MarkdownEditorPreset } from '../../types';
5
+ export declare const createToolbarConfig: <T extends MToolbarData | WToolbarData>(editorType: 'wysiwyg' | 'markup', toolbarPreset: ToolbarsPreset | MarkdownEditorPreset, toolbarName: string) => T;
6
+ interface GetToolbarsConfigsArgs {
7
+ toolbarsPreset?: ToolbarsPreset;
8
+ props: Pick<MarkdownEditorViewProps, 'markupToolbarConfig' | 'wysiwygToolbarConfig' | 'wysiwygHiddenActionsConfig' | 'markupHiddenActionsConfig'>;
9
+ preset: MarkdownEditorPreset;
10
+ }
11
+ export declare const getToolbarsConfigs: ({ toolbarsPreset, props, preset }: GetToolbarsConfigsArgs) => {
12
+ wysiwygToolbarConfig: WToolbarData;
13
+ markupToolbarConfig: MToolbarData;
14
+ wysiwygHiddenActionsConfig: import("../../config/wysiwyg").WToolbarItemData[];
15
+ markupHiddenActionsConfig: import("../../config/markup").MToolbarItemData[];
16
+ };
17
+ export {};
@@ -1,9 +1,10 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.getToolbarsConfigs = exports.createConfig = void 0;
4
- const constants_1 = require("../../modules/toolbars/constants");
5
- const presets_1 = require("../../modules/toolbars/presets");
6
- const toolbar_1 = require("../../toolbar");
3
+ exports.getToolbarsConfigs = exports.createToolbarConfig = void 0;
4
+ const constants_1 = require("../../../modules/toolbars/constants");
5
+ const presets_1 = require("../../../modules/toolbars/presets");
6
+ const toolbar_1 = require("../../../toolbar");
7
+ const flattenPreset_1 = require("./flattenPreset");
7
8
  const defaultPresets = {
8
9
  zero: presets_1.zero,
9
10
  commonmark: presets_1.commonmark,
@@ -20,7 +21,7 @@ const transformItem = (type, item, id = 'unknown') => {
20
21
  const isListButton = item.view.type === toolbar_1.ToolbarDataType.ListButton;
21
22
  return Object.assign(Object.assign(Object.assign({ type: (_a = item.view.type) !== null && _a !== void 0 ? _a : toolbar_1.ToolbarDataType.SingleButton, id, title: item.view.title, hint: item.view.hint, icon: item.view.icon, hotkey: item.view.hotkey }, (isListButton && { withArrow: item.view.withArrow })), (type === 'wysiwyg' && item.wysiwyg && Object.assign({}, item.wysiwyg))), (type === 'markup' && item.markup && Object.assign({}, item.markup)));
22
23
  };
23
- const createConfig = (editorType, toolbarPreset, toolbarName) => {
24
+ const createToolbarConfig = (editorType, toolbarPreset, toolbarName) => {
24
25
  var _a;
25
26
  const preset = typeof toolbarPreset === 'string'
26
27
  ? defaultPresets[toolbarPreset] || defaultPresets.default
@@ -34,26 +35,21 @@ const createConfig = (editorType, toolbarPreset, toolbarName) => {
34
35
  }));
35
36
  return toolbarData;
36
37
  };
37
- exports.createConfig = createConfig;
38
- const flattenPreset = (config) => {
39
- var _a;
40
- // TODO: @makhnatkin add logic for flatten
41
- return ((_a = config[0]) !== null && _a !== void 0 ? _a : []);
42
- };
38
+ exports.createToolbarConfig = createToolbarConfig;
43
39
  const getToolbarsConfigs = ({ toolbarsPreset, props, preset }) => {
44
40
  var _a, _b, _c, _d;
45
41
  const wysiwygToolbarConfig = toolbarsPreset
46
- ? (0, exports.createConfig)('wysiwyg', toolbarsPreset, constants_1.ToolbarName.wysiwygMain)
47
- : (_a = props.wysiwygToolbarConfig) !== null && _a !== void 0 ? _a : (0, exports.createConfig)('wysiwyg', preset, constants_1.ToolbarName.wysiwygMain);
42
+ ? (0, exports.createToolbarConfig)('wysiwyg', toolbarsPreset, constants_1.ToolbarName.wysiwygMain)
43
+ : (_a = props.wysiwygToolbarConfig) !== null && _a !== void 0 ? _a : (0, exports.createToolbarConfig)('wysiwyg', preset, constants_1.ToolbarName.wysiwygMain);
48
44
  const markupToolbarConfig = toolbarsPreset
49
- ? (0, exports.createConfig)('markup', toolbarsPreset, constants_1.ToolbarName.markupMain)
50
- : (_b = props.markupToolbarConfig) !== null && _b !== void 0 ? _b : (0, exports.createConfig)('markup', preset, constants_1.ToolbarName.markupMain);
45
+ ? (0, exports.createToolbarConfig)('markup', toolbarsPreset, constants_1.ToolbarName.markupMain)
46
+ : (_b = props.markupToolbarConfig) !== null && _b !== void 0 ? _b : (0, exports.createToolbarConfig)('markup', preset, constants_1.ToolbarName.markupMain);
51
47
  const wysiwygHiddenActionsConfig = toolbarsPreset
52
- ? flattenPreset((0, exports.createConfig)('wysiwyg', toolbarsPreset, constants_1.ToolbarName.wysiwygHidden))
53
- : (_c = props.wysiwygHiddenActionsConfig) !== null && _c !== void 0 ? _c : flattenPreset((0, exports.createConfig)('wysiwyg', preset, constants_1.ToolbarName.wysiwygHidden));
48
+ ? (0, flattenPreset_1.flattenPreset)((0, exports.createToolbarConfig)('wysiwyg', toolbarsPreset, constants_1.ToolbarName.wysiwygHidden))
49
+ : (_c = props.wysiwygHiddenActionsConfig) !== null && _c !== void 0 ? _c : (0, flattenPreset_1.flattenPreset)((0, exports.createToolbarConfig)('wysiwyg', preset, constants_1.ToolbarName.wysiwygHidden));
54
50
  const markupHiddenActionsConfig = toolbarsPreset
55
- ? flattenPreset((0, exports.createConfig)('markup', toolbarsPreset, constants_1.ToolbarName.markupHidden))
56
- : (_d = props.markupHiddenActionsConfig) !== null && _d !== void 0 ? _d : flattenPreset((0, exports.createConfig)('markup', preset, constants_1.ToolbarName.markupHidden));
51
+ ? (0, flattenPreset_1.flattenPreset)((0, exports.createToolbarConfig)('markup', toolbarsPreset, constants_1.ToolbarName.markupHidden))
52
+ : (_d = props.markupHiddenActionsConfig) !== null && _d !== void 0 ? _d : (0, flattenPreset_1.flattenPreset)((0, exports.createToolbarConfig)('markup', preset, constants_1.ToolbarName.markupHidden));
57
53
  return {
58
54
  wysiwygToolbarConfig,
59
55
  markupToolbarConfig,
@@ -93,6 +93,12 @@ export declare type MarkdownEditorExperimentalOptions = {
93
93
  * Default value is 'disabled'.
94
94
  */
95
95
  directiveSyntax?: DirectiveSyntaxOption;
96
+ /**
97
+ * If we need support for empty strings
98
+ *
99
+ * @default false
100
+ */
101
+ preserveEmptyRows?: boolean;
96
102
  };
97
103
  export declare type MarkdownEditorMarkupConfig = {
98
104
  /**
@@ -2,6 +2,7 @@
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.useMarkdownEditor = void 0;
4
4
  const react_1 = require("react");
5
+ const getTransformers_1 = require("../core/markdown/ProseMirrorTransformer/getTransformers");
5
6
  const extensions_1 = require("../extensions");
6
7
  const logger_1 = require("../logger");
7
8
  const directive_1 = require("../utils/directive");
@@ -13,11 +14,15 @@ function useMarkdownEditor(props, deps = []) {
13
14
  var _a, _b, _c, _d, _e, _f, _g, _h, _j, _k, _l, _m, _o, _p, _q, _r, _s;
14
15
  const { md = {}, initial = {}, handlers = {}, experimental = {}, markupConfig = {}, wysiwygConfig = {}, } = props;
15
16
  const breaks = (_a = md.breaks) !== null && _a !== void 0 ? _a : props.breaks;
17
+ const preserveEmptyRows = experimental.preserveEmptyRows;
16
18
  const preset = (_b = props.preset) !== null && _b !== void 0 ? _b : 'full';
17
19
  const renderStorage = new extensions_1.ReactRenderStorage();
18
20
  const uploadFile = (_c = handlers.uploadFile) !== null && _c !== void 0 ? _c : props.fileUploadHandler;
19
21
  const needToSetDimensionsForUploadedImages = (_d = experimental.needToSetDimensionsForUploadedImages) !== null && _d !== void 0 ? _d : props.needToSetDimensionsForUploadedImages;
20
22
  const enableNewImageSizeCalculation = experimental.enableNewImageSizeCalculation;
23
+ const pmTransformers = (0, getTransformers_1.getPMTransformers)({
24
+ emptyRowTransformer: preserveEmptyRows,
25
+ });
21
26
  const directiveSyntax = new directive_1.DirectiveSyntaxContext(experimental.directiveSyntax);
22
27
  const extensions = (builder) => {
23
28
  var _a;
@@ -29,7 +34,7 @@ function useMarkdownEditor(props, deps = []) {
29
34
  }, onSubmit: () => {
30
35
  editor.emit('submit', null);
31
36
  return true;
32
- }, placeholderOptions: wysiwygConfig.placeholderOptions, mdBreaks: breaks, fileUploadHandler: uploadFile, needToSetDimensionsForUploadedImages,
37
+ }, preserveEmptyRows: preserveEmptyRows, placeholderOptions: wysiwygConfig.placeholderOptions, mdBreaks: breaks, fileUploadHandler: uploadFile, needToSetDimensionsForUploadedImages,
33
38
  enableNewImageSizeCalculation }));
34
39
  {
35
40
  const extraExtensions = wysiwygConfig.extensions || props.extraExtensions;
@@ -40,7 +45,8 @@ function useMarkdownEditor(props, deps = []) {
40
45
  };
41
46
  return new Editor_1.EditorImpl(Object.assign(Object.assign({}, props), { preset,
42
47
  renderStorage,
43
- directiveSyntax, md: Object.assign(Object.assign({}, md), { breaks, html: (_e = md.html) !== null && _e !== void 0 ? _e : props.allowHTML, linkify: (_f = md.linkify) !== null && _f !== void 0 ? _f : props.linkify, linkifyTlds: (_g = md.linkifyTlds) !== null && _g !== void 0 ? _g : props.linkifyTlds }), initial: Object.assign(Object.assign({}, initial), { markup: (_h = initial.markup) !== null && _h !== void 0 ? _h : props.initialMarkup, mode: (_j = initial.mode) !== null && _j !== void 0 ? _j : props.initialEditorMode, toolbarVisible: (_k = initial.toolbarVisible) !== null && _k !== void 0 ? _k : props.initialToolbarVisible, splitModeEnabled: (_l = initial.splitModeEnabled) !== null && _l !== void 0 ? _l : props.initialSplitModeEnabled }), handlers: Object.assign(Object.assign({}, handlers), { uploadFile }), experimental: Object.assign(Object.assign({}, experimental), { needToSetDimensionsForUploadedImages,
48
+ directiveSyntax,
49
+ pmTransformers, md: Object.assign(Object.assign({}, md), { breaks, html: (_e = md.html) !== null && _e !== void 0 ? _e : props.allowHTML, linkify: (_f = md.linkify) !== null && _f !== void 0 ? _f : props.linkify, linkifyTlds: (_g = md.linkifyTlds) !== null && _g !== void 0 ? _g : props.linkifyTlds }), initial: Object.assign(Object.assign({}, initial), { markup: (_h = initial.markup) !== null && _h !== void 0 ? _h : props.initialMarkup, mode: (_j = initial.mode) !== null && _j !== void 0 ? _j : props.initialEditorMode, toolbarVisible: (_k = initial.toolbarVisible) !== null && _k !== void 0 ? _k : props.initialToolbarVisible, splitModeEnabled: (_l = initial.splitModeEnabled) !== null && _l !== void 0 ? _l : props.initialSplitModeEnabled }), handlers: Object.assign(Object.assign({}, handlers), { uploadFile }), experimental: Object.assign(Object.assign({}, experimental), { needToSetDimensionsForUploadedImages,
44
50
  enableNewImageSizeCalculation, prepareRawMarkup: (_m = experimental.prepareRawMarkup) !== null && _m !== void 0 ? _m : props.prepareRawMarkup, beforeEditorModeChange: (_o = experimental.beforeEditorModeChange) !== null && _o !== void 0 ? _o : props.experimental_beforeEditorModeChange }), markupConfig: Object.assign(Object.assign({}, markupConfig), { splitMode: (_p = markupConfig.splitMode) !== null && _p !== void 0 ? _p : props.splitMode, renderPreview: (_q = markupConfig.renderPreview) !== null && _q !== void 0 ? _q : props.renderPreview, extensions: (_r = markupConfig.extensions) !== null && _r !== void 0 ? _r : props.extraMarkupExtensions }), wysiwygConfig: Object.assign(Object.assign({}, wysiwygConfig), { extensions, escapeConfig: (_s = wysiwygConfig.escapeConfig) !== null && _s !== void 0 ? _s : props.escapeConfig }) }));
45
51
  }, deps);
46
52
  (0, react_1.useLayoutEffect)(() => {
@@ -9,6 +9,7 @@ export declare type ExtensionsOptions = BehaviorPresetOptions & FullPresetOption
9
9
  export declare type BundlePresetOptions = ExtensionsOptions & EditorModeKeymapOptions & {
10
10
  preset: MarkdownEditorPreset;
11
11
  mdBreaks?: boolean;
12
+ preserveEmptyRows?: boolean;
12
13
  fileUploadHandler?: FileUploadHandler;
13
14
  placeholderOptions?: WysiwygPlaceholderOptions;
14
15
  /**
@@ -34,7 +34,7 @@ const BundlePreset = (builder, opts) => {
34
34
  return typeof value === 'function'
35
35
  ? value()
36
36
  : value !== null && value !== void 0 ? value : (0, placeholder_1.i18n)('doc_empty');
37
- } }, opts.baseSchema) });
37
+ }, preserveEmptyRows: opts.preserveEmptyRows }, opts.baseSchema) });
38
38
  const commonMarkOptions = Object.assign(Object.assign({}, zeroOptions), { selectionContext: Object.assign({ config: wysiwyg_1.wSelectionMenuConfigByPreset.commonmark }, opts.selectionContext), commandMenu: Object.assign({ actions: wysiwyg_1.wCommandMenuConfigByPreset.commonmark }, opts.commandMenu), breaks: Object.assign({ preferredBreak: (opts.mdBreaks ? 'soft' : 'hard') }, opts.breaks), bold: Object.assign({ boldKey: shortcuts_1.formatter.toPM(shortcuts_1.Action.Bold) }, opts.bold), italic: Object.assign({ italicKey: shortcuts_1.formatter.toPM(shortcuts_1.Action.Italic) }, opts.italic), code: Object.assign({ codeKey: shortcuts_1.formatter.toPM(shortcuts_1.Action.Code) }, opts.code), codeBlock: Object.assign({ codeBlockKey: shortcuts_1.formatter.toPM(shortcuts_1.Action.CodeBlock) }, opts.codeBlock), blockquote: Object.assign({ qouteKey: shortcuts_1.formatter.toPM(shortcuts_1.Action.Quote) }, opts.blockquote), link: Object.assign({ linkKey: shortcuts_1.formatter.toPM(shortcuts_1.Action.Link) }, opts.link), lists: Object.assign({ ulKey: shortcuts_1.formatter.toPM(shortcuts_1.Action.BulletList), olKey: shortcuts_1.formatter.toPM(shortcuts_1.Action.OrderedList), ulInputRules: { plus: false } }, opts.lists), image: {
39
39
  parseInsertedUrlAsImage: (_a = opts.imgSize) === null || _a === void 0 ? void 0 : _a.parseInsertedUrlAsImage,
40
40
  } });
@@ -1,5 +1,6 @@
1
1
  import type { PresetName } from 'markdown-it';
2
2
  import type { CommonEditor, MarkupString } from '../common';
3
+ import { TransformFn } from './markdown/ProseMirrorTransformer';
3
4
  import type { ActionStorage } from './types/actions';
4
5
  import type { Extension } from './types/extension';
5
6
  import type { Parser } from './types/parser';
@@ -18,6 +19,7 @@ export declare type WysiwygEditorOptions = {
18
19
  mdPreset?: PresetName;
19
20
  allowHTML?: boolean;
20
21
  linkify?: boolean;
22
+ pmTransformers?: TransformFn[];
21
23
  linkifyTlds?: string | string[];
22
24
  escapeConfig?: EscapeConfig;
23
25
  /** Call on any state change (move cursor, change selection, etc...) */
@@ -31,7 +33,7 @@ export declare class WysiwygEditor implements CommonEditor, ActionStorage {
31
33
  get serializer(): Serializer;
32
34
  get parser(): Parser;
33
35
  get actions(): WysiwygEditor.Actions;
34
- constructor({ domElem, initialContent, extensions, allowHTML, mdPreset, linkify, linkifyTlds, escapeConfig, onChange, onDocChange, }: WysiwygEditorOptions);
36
+ constructor({ domElem, initialContent, extensions, allowHTML, mdPreset, linkify, pmTransformers, linkifyTlds, escapeConfig, onChange, onDocChange, }: WysiwygEditorOptions);
35
37
  action<T extends keyof WysiwygEditor.Actions>(actionName: T): WysiwygEditor.Actions[T];
36
38
  focus(): void;
37
39
  hasFocus(): boolean;
@@ -10,7 +10,7 @@ const ExtensionsManager_1 = require("./ExtensionsManager");
10
10
  const actions_1 = require("./utils/actions");
11
11
  const metrics_1 = require("./utils/metrics");
12
12
  class WysiwygEditor {
13
- constructor({ domElem, initialContent = '', extensions = () => { }, allowHTML, mdPreset, linkify, linkifyTlds, escapeConfig, onChange, onDocChange, }) {
13
+ constructor({ domElem, initialContent = '', extensions = () => { }, allowHTML, mdPreset, linkify, pmTransformers, linkifyTlds, escapeConfig, onChange, onDocChange, }) {
14
14
  _WysiwygEditor_view.set(this, void 0);
15
15
  _WysiwygEditor_serializer.set(this, void 0);
16
16
  _WysiwygEditor_parser.set(this, void 0);
@@ -21,6 +21,7 @@ class WysiwygEditor {
21
21
  // "breaks" option only affects the renderer, but not the parser
22
22
  mdOpts: { html: allowHTML, linkify, breaks: true, preset: mdPreset },
23
23
  linkifyTlds,
24
+ pmTransformers,
24
25
  });
25
26
  const state = prosemirror_state_1.EditorState.create({
26
27
  schema,
@@ -1,6 +1,7 @@
1
1
  import MarkdownIt, { PresetName } from 'markdown-it';
2
2
  import type { Plugin } from 'prosemirror-state';
3
3
  import { ActionsManager } from './ActionsManager';
4
+ import { TransformFn } from './markdown/ProseMirrorTransformer';
4
5
  import type { ActionSpec } from './types/actions';
5
6
  import type { Extension, ExtensionDeps } from './types/extension';
6
7
  import type { MarkViewConstructor, NodeViewConstructor } from './types/node-views';
@@ -13,6 +14,7 @@ declare type ExtensionsManagerOptions = {
13
14
  preset?: PresetName;
14
15
  };
15
16
  linkifyTlds?: string | string[];
17
+ pmTransformers?: TransformFn[];
16
18
  };
17
19
  export declare class ExtensionsManager {
18
20
  #private;
@@ -1,5 +1,5 @@
1
1
  "use strict";
2
- var _ExtensionsManager_schemaRegistry, _ExtensionsManager_parserRegistry, _ExtensionsManager_serializerRegistry, _ExtensionsManager_nodeViewCreators, _ExtensionsManager_markViewCreators, _ExtensionsManager_mdForMarkup, _ExtensionsManager_mdForText, _ExtensionsManager_extensions, _ExtensionsManager_builder, _ExtensionsManager_spec, _ExtensionsManager_deps, _ExtensionsManager_plugins, _ExtensionsManager_actions, _ExtensionsManager_nodeViews, _ExtensionsManager_markViews;
2
+ var _ExtensionsManager_schemaRegistry, _ExtensionsManager_parserRegistry, _ExtensionsManager_serializerRegistry, _ExtensionsManager_nodeViewCreators, _ExtensionsManager_markViewCreators, _ExtensionsManager_pmTransformers, _ExtensionsManager_mdForMarkup, _ExtensionsManager_mdForText, _ExtensionsManager_extensions, _ExtensionsManager_builder, _ExtensionsManager_spec, _ExtensionsManager_deps, _ExtensionsManager_plugins, _ExtensionsManager_actions, _ExtensionsManager_nodeViews, _ExtensionsManager_markViews;
3
3
  Object.defineProperty(exports, "__esModule", { value: true });
4
4
  exports.ExtensionsManager = void 0;
5
5
  const tslib_1 = require("tslib");
@@ -17,6 +17,7 @@ class ExtensionsManager {
17
17
  _ExtensionsManager_serializerRegistry.set(this, new SerializerTokensRegistry_1.SerializerTokensRegistry());
18
18
  _ExtensionsManager_nodeViewCreators.set(this, new Map());
19
19
  _ExtensionsManager_markViewCreators.set(this, new Map());
20
+ _ExtensionsManager_pmTransformers.set(this, []);
20
21
  _ExtensionsManager_mdForMarkup.set(this, void 0);
21
22
  _ExtensionsManager_mdForText.set(this, void 0);
22
23
  _ExtensionsManager_extensions.set(this, void 0);
@@ -51,6 +52,9 @@ class ExtensionsManager {
51
52
  tslib_1.__classPrivateFieldGet(this, _ExtensionsManager_mdForMarkup, "f").linkify.tlds(options.linkifyTlds, true);
52
53
  tslib_1.__classPrivateFieldGet(this, _ExtensionsManager_mdForText, "f").linkify.tlds(options.linkifyTlds, true);
53
54
  }
55
+ if (options.pmTransformers) {
56
+ tslib_1.__classPrivateFieldSet(this, _ExtensionsManager_pmTransformers, options.pmTransformers, "f");
57
+ }
54
58
  // TODO: add prefilled context
55
59
  tslib_1.__classPrivateFieldSet(this, _ExtensionsManager_builder, new ExtensionBuilder_1.ExtensionBuilder(), "f");
56
60
  }
@@ -80,8 +84,8 @@ class ExtensionsManager {
80
84
  tslib_1.__classPrivateFieldSet(this, _ExtensionsManager_deps, {
81
85
  schema,
82
86
  actions: new ActionsManager_1.ActionsManager(),
83
- markupParser: tslib_1.__classPrivateFieldGet(this, _ExtensionsManager_parserRegistry, "f").createParser(schema, tslib_1.__classPrivateFieldGet(this, _ExtensionsManager_mdForMarkup, "f")),
84
- textParser: tslib_1.__classPrivateFieldGet(this, _ExtensionsManager_parserRegistry, "f").createParser(schema, tslib_1.__classPrivateFieldGet(this, _ExtensionsManager_mdForText, "f")),
87
+ markupParser: tslib_1.__classPrivateFieldGet(this, _ExtensionsManager_parserRegistry, "f").createParser(schema, tslib_1.__classPrivateFieldGet(this, _ExtensionsManager_mdForMarkup, "f"), tslib_1.__classPrivateFieldGet(this, _ExtensionsManager_pmTransformers, "f")),
88
+ textParser: tslib_1.__classPrivateFieldGet(this, _ExtensionsManager_parserRegistry, "f").createParser(schema, tslib_1.__classPrivateFieldGet(this, _ExtensionsManager_mdForText, "f"), tslib_1.__classPrivateFieldGet(this, _ExtensionsManager_pmTransformers, "f")),
85
89
  serializer: tslib_1.__classPrivateFieldGet(this, _ExtensionsManager_serializerRegistry, "f").createSerializer(),
86
90
  }, "f");
87
91
  }
@@ -97,4 +101,4 @@ class ExtensionsManager {
97
101
  }
98
102
  }
99
103
  exports.ExtensionsManager = ExtensionsManager;
100
- _ExtensionsManager_schemaRegistry = new WeakMap(), _ExtensionsManager_parserRegistry = new WeakMap(), _ExtensionsManager_serializerRegistry = new WeakMap(), _ExtensionsManager_nodeViewCreators = new WeakMap(), _ExtensionsManager_markViewCreators = new WeakMap(), _ExtensionsManager_mdForMarkup = new WeakMap(), _ExtensionsManager_mdForText = new WeakMap(), _ExtensionsManager_extensions = new WeakMap(), _ExtensionsManager_builder = new WeakMap(), _ExtensionsManager_spec = new WeakMap(), _ExtensionsManager_deps = new WeakMap(), _ExtensionsManager_plugins = new WeakMap(), _ExtensionsManager_actions = new WeakMap(), _ExtensionsManager_nodeViews = new WeakMap(), _ExtensionsManager_markViews = new WeakMap();
104
+ _ExtensionsManager_schemaRegistry = new WeakMap(), _ExtensionsManager_parserRegistry = new WeakMap(), _ExtensionsManager_serializerRegistry = new WeakMap(), _ExtensionsManager_nodeViewCreators = new WeakMap(), _ExtensionsManager_markViewCreators = new WeakMap(), _ExtensionsManager_pmTransformers = new WeakMap(), _ExtensionsManager_mdForMarkup = new WeakMap(), _ExtensionsManager_mdForText = new WeakMap(), _ExtensionsManager_extensions = new WeakMap(), _ExtensionsManager_builder = new WeakMap(), _ExtensionsManager_spec = new WeakMap(), _ExtensionsManager_deps = new WeakMap(), _ExtensionsManager_plugins = new WeakMap(), _ExtensionsManager_actions = new WeakMap(), _ExtensionsManager_nodeViews = new WeakMap(), _ExtensionsManager_markViews = new WeakMap();
@@ -1,8 +1,9 @@
1
1
  import type MarkdownIt from 'markdown-it';
2
2
  import type { Schema } from 'prosemirror-model';
3
+ import { TransformFn } from './markdown/ProseMirrorTransformer';
3
4
  import type { Parser, ParserToken } from './types/parser';
4
5
  export declare class ParserTokensRegistry {
5
6
  #private;
6
7
  addToken(name: string, token: ParserToken): this;
7
- createParser(schema: Schema, tokenizer: MarkdownIt): Parser;
8
+ createParser(schema: Schema, tokenizer: MarkdownIt, pmTransformers: TransformFn[]): Parser;
8
9
  }
@@ -12,8 +12,8 @@ class ParserTokensRegistry {
12
12
  tslib_1.__classPrivateFieldGet(this, _ParserTokensRegistry_tokens, "f")[name] = token;
13
13
  return this;
14
14
  }
15
- createParser(schema, tokenizer) {
16
- return new MarkdownParser_1.MarkdownParser(schema, tokenizer, tslib_1.__classPrivateFieldGet(this, _ParserTokensRegistry_tokens, "f"));
15
+ createParser(schema, tokenizer, pmTransformers) {
16
+ return new MarkdownParser_1.MarkdownParser(schema, tokenizer, tslib_1.__classPrivateFieldGet(this, _ParserTokensRegistry_tokens, "f"), pmTransformers);
17
17
  }
18
18
  }
19
19
  exports.ParserTokensRegistry = ParserTokensRegistry;
@@ -2,6 +2,7 @@ import type { Match } from 'linkify-it';
2
2
  import type MarkdownIt from 'markdown-it';
3
3
  import { Mark, Node, NodeType, Schema } from 'prosemirror-model';
4
4
  import type { Parser, ParserToken } from '../types/parser';
5
+ import { TransformFn } from './ProseMirrorTransformer';
5
6
  declare type TokenAttrs = {
6
7
  [name: string]: unknown;
7
8
  };
@@ -15,7 +16,8 @@ export declare class MarkdownParser implements Parser {
15
16
  marks: readonly Mark[];
16
17
  tokens: Record<string, ParserToken>;
17
18
  tokenizer: MarkdownIt;
18
- constructor(schema: Schema, tokenizer: MarkdownIt, tokens: Record<string, ParserToken>);
19
+ pmTransformers: TransformFn[];
20
+ constructor(schema: Schema, tokenizer: MarkdownIt, tokens: Record<string, ParserToken>, pmTransformers: TransformFn[]);
19
21
  validateLink(url: string): boolean;
20
22
  normalizeLink(url: string): string;
21
23
  normalizeLinkText(url: string): string;
@@ -3,6 +3,7 @@ Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.MarkdownParser = void 0;
4
4
  const prosemirror_model_1 = require("prosemirror-model");
5
5
  const logger_1 = require("../../logger");
6
+ const ProseMirrorTransformer_1 = require("./ProseMirrorTransformer");
6
7
  const openSuffix = '_open';
7
8
  const closeSuffix = '_close';
8
9
  var TokenType;
@@ -12,12 +13,13 @@ var TokenType;
12
13
  TokenType["default"] = "default";
13
14
  })(TokenType || (TokenType = {}));
14
15
  class MarkdownParser {
15
- constructor(schema, tokenizer, tokens) {
16
+ constructor(schema, tokenizer, tokens, pmTransformers) {
16
17
  this.stack = [];
17
18
  this.schema = schema;
18
19
  this.marks = prosemirror_model_1.Mark.none;
19
20
  this.tokens = tokens;
20
21
  this.tokenizer = tokenizer;
22
+ this.pmTransformers = pmTransformers;
21
23
  }
22
24
  validateLink(url) {
23
25
  return this.tokenizer.validateLink(url);
@@ -50,7 +52,8 @@ class MarkdownParser {
50
52
  do {
51
53
  doc = this.closeNode();
52
54
  } while (this.stack.length);
53
- return (doc || this.schema.topNodeType.createAndFill());
55
+ const pmTransformer = new ProseMirrorTransformer_1.ProseMirrorTransformer(this.pmTransformers);
56
+ return doc ? pmTransformer.transform(doc) : this.schema.topNodeType.createAndFill();
54
57
  }
55
58
  finally {
56
59
  logger_1.logger.metrics({ component: 'parser', event: 'parse', duration: Date.now() - time });
@@ -165,7 +165,7 @@ class MarkdownSerializerState {
165
165
  const startOfLine = this.atBlank() || this.closed;
166
166
  this.write();
167
167
  let text = lines[i];
168
- if (escape !== false)
168
+ if (escape !== false && this.options.escape !== false)
169
169
  text = this.esc(text, startOfLine);
170
170
  if (this.escapeWhitespace)
171
171
  text = this.escWhitespace(text);
@@ -0,0 +1,2 @@
1
+ import { TransformFn } from './index';
2
+ export declare const transformEmptyParagraph: TransformFn;
@@ -0,0 +1,15 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.transformEmptyParagraph = void 0;
4
+ const transformEmptyParagraph = (node) => {
5
+ var _a, _b;
6
+ if (node.type !== 'paragraph')
7
+ return;
8
+ if (((_a = node.content) === null || _a === void 0 ? void 0 : _a.length) !== 1)
9
+ return;
10
+ if (((_b = node.content[0]) === null || _b === void 0 ? void 0 : _b.type) !== 'text')
11
+ return;
12
+ if (node.content[0].text === String.fromCharCode(160))
13
+ delete node.content;
14
+ };
15
+ exports.transformEmptyParagraph = transformEmptyParagraph;
@@ -0,0 +1,7 @@
1
+ import { TransformFn } from '.';
2
+ declare type GetTransformersProps = {
3
+ emptyRowTransformer?: boolean;
4
+ };
5
+ declare type GetPMTransformersType = (config: GetTransformersProps) => TransformFn[];
6
+ export declare const getPMTransformers: GetPMTransformersType;
7
+ export {};
@@ -0,0 +1,13 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.getPMTransformers = void 0;
4
+ // TODO: add a new method to the ExtensionBuilder
5
+ const emptyRowTransformer_1 = require("./emptyRowTransformer");
6
+ const getPMTransformers = ({ emptyRowTransformer }) => {
7
+ const transformers = [];
8
+ if (emptyRowTransformer) {
9
+ transformers.push(emptyRowTransformer_1.transformEmptyParagraph);
10
+ }
11
+ return transformers;
12
+ };
13
+ exports.getPMTransformers = getPMTransformers;
@@ -0,0 +1,15 @@
1
+ import { Node } from 'prosemirror-model';
2
+ declare type PMNodeJSON = {
3
+ type: string;
4
+ attrs?: Record<string, any>;
5
+ content?: PMNodeJSON[];
6
+ text?: string;
7
+ };
8
+ export declare type TransformFn = (node: PMNodeJSON) => void;
9
+ export declare class ProseMirrorTransformer {
10
+ private readonly _transformers;
11
+ constructor(fns: TransformFn[]);
12
+ transform(doc: Node): Node;
13
+ transformJSON(node: PMNodeJSON): void;
14
+ }
15
+ export {};
@@ -0,0 +1,25 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.ProseMirrorTransformer = void 0;
4
+ const prosemirror_model_1 = require("prosemirror-model");
5
+ class ProseMirrorTransformer {
6
+ constructor(fns) {
7
+ this._transformers = fns;
8
+ }
9
+ transform(doc) {
10
+ const docJSON = doc.toJSON();
11
+ this.transformJSON(docJSON);
12
+ return prosemirror_model_1.Node.fromJSON(doc.type.schema, docJSON);
13
+ }
14
+ transformJSON(node) {
15
+ for (const fn of this._transformers) {
16
+ fn(node);
17
+ }
18
+ if (node.content) {
19
+ for (const child of node.content) {
20
+ this.transformJSON(child);
21
+ }
22
+ }
23
+ }
24
+ }
25
+ exports.ProseMirrorTransformer = ProseMirrorTransformer;
@@ -44,6 +44,7 @@ const MathSpecs = (builder) => {
44
44
  code: true,
45
45
  toDOM: () => ['div', { class: 'math-block' }, 0],
46
46
  parseDOM: [{ tag: 'div.math-block', priority: 200 }],
47
+ selectable: true,
47
48
  },
48
49
  fromMd: {
49
50
  tokenName: 'math_block',
@@ -8,5 +8,6 @@ export declare enum BaseNode {
8
8
  export declare const pType: (schema: import("prosemirror-model").Schema<any, any>) => import("prosemirror-model").NodeType;
9
9
  export declare type BaseSchemaSpecsOptions = {
10
10
  paragraphPlaceholder?: NonNullable<NodeSpec['placeholder']>['content'];
11
+ preserveEmptyRows?: boolean;
11
12
  };
12
13
  export declare const BaseSchemaSpecs: ExtensionAuto<BaseSchemaSpecsOptions>;