@gravity-ui/markdown-editor 14.11.1 → 14.12.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 (108) hide show
  1. package/build/cjs/bundle/Editor.js +9 -2
  2. package/build/cjs/bundle/MarkupManager.d.ts +54 -0
  3. package/build/cjs/bundle/MarkupManager.js +68 -0
  4. package/build/cjs/bundle/config/dynamicModifiers.d.ts +3 -0
  5. package/build/cjs/bundle/config/dynamicModifiers.js +76 -0
  6. package/build/cjs/bundle/config/markup.js +7 -0
  7. package/build/cjs/bundle/config/previews/ActionPreview.css +45 -0
  8. package/build/cjs/bundle/config/previews/ActionPreview.d.ts +4 -0
  9. package/build/cjs/bundle/config/previews/ActionPreview.js +11 -0
  10. package/build/cjs/bundle/config/previews/HeadingPreview.d.ts +5 -0
  11. package/build/cjs/bundle/config/previews/HeadingPreview.js +16 -0
  12. package/build/cjs/bundle/config/previews/TextPreview.d.ts +1 -0
  13. package/build/cjs/bundle/config/previews/TextPreview.js +14 -0
  14. package/build/cjs/bundle/config/w-heading-config.js +11 -0
  15. package/build/cjs/bundle/toolbar/utils/toolbarsConfigs.js +2 -1
  16. package/build/cjs/bundle/types.d.ts +11 -0
  17. package/build/cjs/core/Editor.d.ts +2 -2
  18. package/build/cjs/core/Editor.js +16 -1
  19. package/build/cjs/core/ExtensionsManager.d.ts +12 -2
  20. package/build/cjs/core/ExtensionsManager.js +29 -13
  21. package/build/cjs/core/ParserTokensRegistry.d.ts +2 -1
  22. package/build/cjs/core/ParserTokensRegistry.js +2 -2
  23. package/build/cjs/core/SchemaDynamicModifier.d.ts +3 -0
  24. package/build/cjs/core/SchemaDynamicModifier.js +25 -0
  25. package/build/cjs/core/SchemaSpecRegistry.d.ts +2 -1
  26. package/build/cjs/core/SchemaSpecRegistry.js +9 -4
  27. package/build/cjs/core/SerializerTokensRegistry.d.ts +2 -1
  28. package/build/cjs/core/SerializerTokensRegistry.js +2 -2
  29. package/build/cjs/core/index.d.ts +2 -0
  30. package/build/cjs/core/markdown/MarkdownParser.d.ts +7 -3
  31. package/build/cjs/core/markdown/MarkdownParser.js +85 -16
  32. package/build/cjs/core/markdown/MarkdownSerializer.d.ts +4 -2
  33. package/build/cjs/core/markdown/MarkdownSerializer.js +16 -6
  34. package/build/cjs/core/markdown/MarkdownSerializerDynamicModifier.d.ts +1 -0
  35. package/build/cjs/core/markdown/MarkdownSerializerDynamicModifier.js +47 -0
  36. package/build/cjs/core/types/dynamicModifiers.d.ts +1 -0
  37. package/build/cjs/core/types/dynamicModifiers.js +2 -0
  38. package/build/cjs/core/utils/dynamicModifiers.d.ts +9 -0
  39. package/build/cjs/core/utils/dynamicModifiers.js +48 -0
  40. package/build/cjs/extensions/behavior/CommandMenu/component.d.ts +1 -1
  41. package/build/cjs/extensions/behavior/CommandMenu/component.js +10 -8
  42. package/build/cjs/i18n/action-previews/en.json +5 -0
  43. package/build/cjs/i18n/action-previews/index.d.ts +7 -0
  44. package/build/cjs/i18n/action-previews/index.js +9 -0
  45. package/build/cjs/i18n/action-previews/ru.json +5 -0
  46. package/build/cjs/modules/toolbars/items.js +9 -0
  47. package/build/cjs/modules/toolbars/types.d.ts +1 -0
  48. package/build/cjs/toolbar/PreviewTooltip.css +8 -0
  49. package/build/cjs/toolbar/PreviewTooltip.d.ts +7 -0
  50. package/build/cjs/toolbar/PreviewTooltip.js +13 -0
  51. package/build/cjs/toolbar/ToolbarListButton.js +23 -18
  52. package/build/cjs/toolbar/types.d.ts +1 -0
  53. package/build/cjs/version.js +1 -1
  54. package/build/esm/bundle/Editor.js +9 -2
  55. package/build/esm/bundle/MarkupManager.d.ts +54 -0
  56. package/build/esm/bundle/MarkupManager.js +64 -0
  57. package/build/esm/bundle/config/dynamicModifiers.d.ts +3 -0
  58. package/build/esm/bundle/config/dynamicModifiers.js +72 -0
  59. package/build/esm/bundle/config/markup.js +7 -0
  60. package/build/esm/bundle/config/previews/ActionPreview.css +45 -0
  61. package/build/esm/bundle/config/previews/ActionPreview.d.ts +5 -0
  62. package/build/esm/bundle/config/previews/ActionPreview.js +7 -0
  63. package/build/esm/bundle/config/previews/HeadingPreview.d.ts +6 -0
  64. package/build/esm/bundle/config/previews/HeadingPreview.js +12 -0
  65. package/build/esm/bundle/config/previews/TextPreview.d.ts +2 -0
  66. package/build/esm/bundle/config/previews/TextPreview.js +10 -0
  67. package/build/esm/bundle/config/w-heading-config.js +10 -0
  68. package/build/esm/bundle/toolbar/utils/toolbarsConfigs.js +2 -1
  69. package/build/esm/bundle/types.d.ts +11 -0
  70. package/build/esm/core/Editor.d.ts +2 -2
  71. package/build/esm/core/Editor.js +16 -1
  72. package/build/esm/core/ExtensionsManager.d.ts +12 -2
  73. package/build/esm/core/ExtensionsManager.js +29 -13
  74. package/build/esm/core/ParserTokensRegistry.d.ts +2 -1
  75. package/build/esm/core/ParserTokensRegistry.js +2 -2
  76. package/build/esm/core/SchemaDynamicModifier.d.ts +3 -0
  77. package/build/esm/core/SchemaDynamicModifier.js +21 -0
  78. package/build/esm/core/SchemaSpecRegistry.d.ts +2 -1
  79. package/build/esm/core/SchemaSpecRegistry.js +9 -4
  80. package/build/esm/core/SerializerTokensRegistry.d.ts +2 -1
  81. package/build/esm/core/SerializerTokensRegistry.js +2 -2
  82. package/build/esm/core/index.d.ts +2 -0
  83. package/build/esm/core/markdown/MarkdownParser.d.ts +7 -3
  84. package/build/esm/core/markdown/MarkdownParser.js +83 -15
  85. package/build/esm/core/markdown/MarkdownSerializer.d.ts +4 -2
  86. package/build/esm/core/markdown/MarkdownSerializer.js +16 -6
  87. package/build/esm/core/markdown/MarkdownSerializerDynamicModifier.d.ts +1 -0
  88. package/build/esm/core/markdown/MarkdownSerializerDynamicModifier.js +43 -0
  89. package/build/esm/core/types/dynamicModifiers.d.ts +1 -0
  90. package/build/esm/core/types/dynamicModifiers.js +1 -0
  91. package/build/esm/core/utils/dynamicModifiers.d.ts +9 -0
  92. package/build/esm/core/utils/dynamicModifiers.js +44 -0
  93. package/build/esm/extensions/behavior/CommandMenu/component.d.ts +1 -1
  94. package/build/esm/extensions/behavior/CommandMenu/component.js +10 -8
  95. package/build/esm/i18n/action-previews/en.json +5 -0
  96. package/build/esm/i18n/action-previews/index.d.ts +7 -0
  97. package/build/esm/i18n/action-previews/index.js +5 -0
  98. package/build/esm/i18n/action-previews/ru.json +5 -0
  99. package/build/esm/modules/toolbars/items.js +9 -0
  100. package/build/esm/modules/toolbars/types.d.ts +1 -0
  101. package/build/esm/toolbar/PreviewTooltip.css +8 -0
  102. package/build/esm/toolbar/PreviewTooltip.d.ts +8 -0
  103. package/build/esm/toolbar/PreviewTooltip.js +9 -0
  104. package/build/esm/toolbar/ToolbarListButton.js +23 -18
  105. package/build/esm/toolbar/types.d.ts +1 -0
  106. package/build/esm/version.js +1 -1
  107. package/build/styles.css +53 -0
  108. package/package.json +5 -4
@@ -1,5 +1,5 @@
1
1
  "use strict";
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;
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, _ExtensionsManager_serializerDynamicModifier, _ExtensionsManager_parserDynamicModifier;
3
3
  Object.defineProperty(exports, "__esModule", { value: true });
4
4
  exports.ExtensionsManager = void 0;
5
5
  const tslib_1 = require("tslib");
@@ -11,10 +11,10 @@ const SchemaSpecRegistry_1 = require("./SchemaSpecRegistry");
11
11
  const SerializerTokensRegistry_1 = require("./SerializerTokensRegistry");
12
12
  class ExtensionsManager {
13
13
  constructor({ extensions, options = {} }) {
14
- var _a, _b, _c, _d;
15
- _ExtensionsManager_schemaRegistry.set(this, new SchemaSpecRegistry_1.SchemaSpecRegistry());
16
- _ExtensionsManager_parserRegistry.set(this, new ParserTokensRegistry_1.ParserTokensRegistry());
17
- _ExtensionsManager_serializerRegistry.set(this, new SerializerTokensRegistry_1.SerializerTokensRegistry());
14
+ var _a, _b, _c, _d, _e, _f, _g;
15
+ _ExtensionsManager_schemaRegistry.set(this, void 0);
16
+ _ExtensionsManager_parserRegistry.set(this, void 0);
17
+ _ExtensionsManager_serializerRegistry.set(this, void 0);
18
18
  _ExtensionsManager_nodeViewCreators.set(this, new Map());
19
19
  _ExtensionsManager_markViewCreators.set(this, new Map());
20
20
  _ExtensionsManager_pmTransformers.set(this, []);
@@ -28,6 +28,8 @@ class ExtensionsManager {
28
28
  _ExtensionsManager_actions.set(this, {});
29
29
  _ExtensionsManager_nodeViews.set(this, {});
30
30
  _ExtensionsManager_markViews.set(this, {});
31
+ _ExtensionsManager_serializerDynamicModifier.set(this, void 0);
32
+ _ExtensionsManager_parserDynamicModifier.set(this, void 0);
31
33
  this.processNode = (name, { spec, fromMd, toMd: toMd, view }) => {
32
34
  tslib_1.__classPrivateFieldGet(this, _ExtensionsManager_schemaRegistry, "f").addNode(name, spec);
33
35
  tslib_1.__classPrivateFieldGet(this, _ExtensionsManager_parserRegistry, "f").addToken(fromMd.tokenName || name, fromMd.tokenSpec);
@@ -44,10 +46,17 @@ class ExtensionsManager {
44
46
  tslib_1.__classPrivateFieldGet(this, _ExtensionsManager_markViewCreators, "f").set(name, view);
45
47
  }
46
48
  };
49
+ tslib_1.__classPrivateFieldSet(this, _ExtensionsManager_schemaRegistry, new SchemaSpecRegistry_1.SchemaSpecRegistry(undefined, (_a = options.dynamicModifiers) === null || _a === void 0 ? void 0 : _a.schema), "f");
50
+ tslib_1.__classPrivateFieldSet(this, _ExtensionsManager_parserRegistry, new ParserTokensRegistry_1.ParserTokensRegistry(), "f");
51
+ tslib_1.__classPrivateFieldSet(this, _ExtensionsManager_serializerRegistry, new SerializerTokensRegistry_1.SerializerTokensRegistry(), "f");
52
+ if (options.dynamicModifiers) {
53
+ tslib_1.__classPrivateFieldSet(this, _ExtensionsManager_parserDynamicModifier, (_b = options.dynamicModifiers) === null || _b === void 0 ? void 0 : _b.parser, "f");
54
+ tslib_1.__classPrivateFieldSet(this, _ExtensionsManager_serializerDynamicModifier, (_c = options.dynamicModifiers) === null || _c === void 0 ? void 0 : _c.serializer, "f");
55
+ }
47
56
  tslib_1.__classPrivateFieldSet(this, _ExtensionsManager_extensions, extensions, "f");
48
- const mdPreset = (_b = (_a = options.mdOpts) === null || _a === void 0 ? void 0 : _a.preset) !== null && _b !== void 0 ? _b : 'default';
49
- tslib_1.__classPrivateFieldSet(this, _ExtensionsManager_mdForMarkup, new markdown_it_1.default(mdPreset, (_c = options.mdOpts) !== null && _c !== void 0 ? _c : {}), "f");
50
- tslib_1.__classPrivateFieldSet(this, _ExtensionsManager_mdForText, new markdown_it_1.default(mdPreset, (_d = options.mdOpts) !== null && _d !== void 0 ? _d : {}), "f");
57
+ const mdPreset = (_e = (_d = options.mdOpts) === null || _d === void 0 ? void 0 : _d.preset) !== null && _e !== void 0 ? _e : 'default';
58
+ tslib_1.__classPrivateFieldSet(this, _ExtensionsManager_mdForMarkup, new markdown_it_1.default(mdPreset, (_f = options.mdOpts) !== null && _f !== void 0 ? _f : {}), "f");
59
+ tslib_1.__classPrivateFieldSet(this, _ExtensionsManager_mdForText, new markdown_it_1.default(mdPreset, (_g = options.mdOpts) !== null && _g !== void 0 ? _g : {}), "f");
51
60
  if (options.linkifyTlds) {
52
61
  tslib_1.__classPrivateFieldGet(this, _ExtensionsManager_mdForMarkup, "f").linkify.tlds(options.linkifyTlds, true);
53
62
  tslib_1.__classPrivateFieldGet(this, _ExtensionsManager_mdForText, "f").linkify.tlds(options.linkifyTlds, true);
@@ -79,14 +88,21 @@ class ExtensionsManager {
79
88
  tslib_1.__classPrivateFieldGet(this, _ExtensionsManager_spec, "f").nodes().forEach(this.processNode);
80
89
  tslib_1.__classPrivateFieldGet(this, _ExtensionsManager_spec, "f").marks().forEach(this.processMark);
81
90
  }
91
+ createParser(schema, mdInstance) {
92
+ return tslib_1.__classPrivateFieldGet(this, _ExtensionsManager_parserRegistry, "f").createParser(schema, mdInstance, tslib_1.__classPrivateFieldGet(this, _ExtensionsManager_pmTransformers, "f"), tslib_1.__classPrivateFieldGet(this, _ExtensionsManager_parserDynamicModifier, "f"));
93
+ }
82
94
  createDeps() {
95
+ const actions = new ActionsManager_1.ActionsManager();
83
96
  const schema = tslib_1.__classPrivateFieldGet(this, _ExtensionsManager_schemaRegistry, "f").createSchema();
97
+ const markupParser = this.createParser(schema, tslib_1.__classPrivateFieldGet(this, _ExtensionsManager_mdForMarkup, "f"));
98
+ const textParser = this.createParser(schema, tslib_1.__classPrivateFieldGet(this, _ExtensionsManager_mdForText, "f"));
99
+ const serializer = tslib_1.__classPrivateFieldGet(this, _ExtensionsManager_serializerRegistry, "f").createSerializer(tslib_1.__classPrivateFieldGet(this, _ExtensionsManager_serializerDynamicModifier, "f"));
84
100
  tslib_1.__classPrivateFieldSet(this, _ExtensionsManager_deps, {
85
101
  schema,
86
- actions: new ActionsManager_1.ActionsManager(),
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")),
89
- serializer: tslib_1.__classPrivateFieldGet(this, _ExtensionsManager_serializerRegistry, "f").createSerializer(),
102
+ actions,
103
+ markupParser,
104
+ textParser,
105
+ serializer,
90
106
  }, "f");
91
107
  }
92
108
  createDerived() {
@@ -101,4 +117,4 @@ class ExtensionsManager {
101
117
  }
102
118
  }
103
119
  exports.ExtensionsManager = ExtensionsManager;
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();
120
+ _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(), _ExtensionsManager_serializerDynamicModifier = new WeakMap(), _ExtensionsManager_parserDynamicModifier = new WeakMap();
@@ -1,9 +1,10 @@
1
1
  import type MarkdownIt from 'markdown-it';
2
2
  import type { Schema } from 'prosemirror-model';
3
+ import { MarkdownParserDynamicModifier } from './markdown/MarkdownParser';
3
4
  import { TransformFn } from './markdown/ProseMirrorTransformer';
4
5
  import type { Parser, ParserToken } from './types/parser';
5
6
  export declare class ParserTokensRegistry {
6
7
  #private;
7
8
  addToken(name: string, token: ParserToken): this;
8
- createParser(schema: Schema, tokenizer: MarkdownIt, pmTransformers: TransformFn[]): Parser;
9
+ createParser(schema: Schema, tokenizer: MarkdownIt, pmTransformers: TransformFn[], dynamicModifier?: MarkdownParserDynamicModifier): Parser;
9
10
  }
@@ -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, pmTransformers) {
16
- return new MarkdownParser_1.MarkdownParser(schema, tokenizer, tslib_1.__classPrivateFieldGet(this, _ParserTokensRegistry_tokens, "f"), pmTransformers);
15
+ createParser(schema, tokenizer, pmTransformers, dynamicModifier) {
16
+ return new MarkdownParser_1.MarkdownParser(schema, tokenizer, tslib_1.__classPrivateFieldGet(this, _ParserTokensRegistry_tokens, "f"), pmTransformers, dynamicModifier);
17
17
  }
18
18
  }
19
19
  exports.ParserTokensRegistry = ParserTokensRegistry;
@@ -0,0 +1,3 @@
1
+ export declare type TokenAttrs = {
2
+ [name: string]: unknown;
3
+ };
@@ -0,0 +1,25 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.SchemaDynamicModifier = void 0;
4
+ /** @internal */
5
+ class SchemaDynamicModifier {
6
+ constructor(config) {
7
+ this.nodeSpecsProcessors = new Map(Object.entries(config));
8
+ }
9
+ processNodeSpec(name, nodeSpec) {
10
+ let updatedSpec = nodeSpec;
11
+ this.nodeSpecsProcessors.forEach((processor, elementType) => {
12
+ if (name === elementType &&
13
+ processor.allowedAttrs &&
14
+ processor.allowedAttrs.length > 0 &&
15
+ nodeSpec) {
16
+ updatedSpec = Object.assign(Object.assign({}, nodeSpec), { attrs: Object.assign(Object.assign({}, nodeSpec.attrs), processor.allowedAttrs.reduce((acc, key) => {
17
+ acc[key] = { default: null };
18
+ return acc;
19
+ }, {})) });
20
+ }
21
+ });
22
+ return updatedSpec;
23
+ }
24
+ }
25
+ exports.SchemaDynamicModifier = SchemaDynamicModifier;
@@ -1,7 +1,8 @@
1
1
  import { MarkSpec, NodeSpec, Schema } from 'prosemirror-model';
2
+ import { SchemaDynamicModifier } from './SchemaDynamicModifier';
2
3
  export declare class SchemaSpecRegistry {
3
4
  #private;
4
- constructor(topNode?: string);
5
+ constructor(topNode?: string, dynamicModifier?: SchemaDynamicModifier);
5
6
  addNode(name: string, spec: NodeSpec): this;
6
7
  addMark(name: string, spec: MarkSpec): this;
7
8
  createSchema(): Schema<string, string>;
@@ -1,16 +1,21 @@
1
1
  "use strict";
2
- var _SchemaSpecRegistry_spec;
2
+ var _SchemaSpecRegistry_spec, _SchemaSpecRegistry_dynamicModifier;
3
3
  Object.defineProperty(exports, "__esModule", { value: true });
4
4
  exports.SchemaSpecRegistry = void 0;
5
5
  const tslib_1 = require("tslib");
6
6
  const prosemirror_model_1 = require("prosemirror-model");
7
7
  class SchemaSpecRegistry {
8
- constructor(topNode) {
8
+ constructor(topNode, dynamicModifier) {
9
9
  _SchemaSpecRegistry_spec.set(this, void 0);
10
+ _SchemaSpecRegistry_dynamicModifier.set(this, void 0);
10
11
  tslib_1.__classPrivateFieldSet(this, _SchemaSpecRegistry_spec, { topNode, nodes: {}, marks: {} }, "f");
12
+ tslib_1.__classPrivateFieldSet(this, _SchemaSpecRegistry_dynamicModifier, dynamicModifier, "f");
11
13
  }
12
14
  addNode(name, spec) {
13
- tslib_1.__classPrivateFieldGet(this, _SchemaSpecRegistry_spec, "f").nodes[name] = spec;
15
+ const modifiedSpec = tslib_1.__classPrivateFieldGet(this, _SchemaSpecRegistry_dynamicModifier, "f")
16
+ ? tslib_1.__classPrivateFieldGet(this, _SchemaSpecRegistry_dynamicModifier, "f").processNodeSpec(name, spec)
17
+ : spec;
18
+ tslib_1.__classPrivateFieldGet(this, _SchemaSpecRegistry_spec, "f").nodes[name] = modifiedSpec;
14
19
  return this;
15
20
  }
16
21
  addMark(name, spec) {
@@ -22,4 +27,4 @@ class SchemaSpecRegistry {
22
27
  }
23
28
  }
24
29
  exports.SchemaSpecRegistry = SchemaSpecRegistry;
25
- _SchemaSpecRegistry_spec = new WeakMap();
30
+ _SchemaSpecRegistry_spec = new WeakMap(), _SchemaSpecRegistry_dynamicModifier = new WeakMap();
@@ -1,7 +1,8 @@
1
+ import { MarkdownSerializerDynamicModifier } from './markdown/MarkdownSerializerDynamicModifier';
1
2
  import type { Serializer, SerializerMarkToken, SerializerNodeToken } from './types/serializer';
2
3
  export declare class SerializerTokensRegistry {
3
4
  #private;
4
5
  addNode(name: string, node: SerializerNodeToken): this;
5
6
  addMark(name: string, mark: SerializerMarkToken): this;
6
- createSerializer(): Serializer;
7
+ createSerializer(dynamicModifier?: MarkdownSerializerDynamicModifier): Serializer;
7
8
  }
@@ -17,8 +17,8 @@ class SerializerTokensRegistry {
17
17
  tslib_1.__classPrivateFieldGet(this, _SerializerTokensRegistry_marks, "f")[name] = mark;
18
18
  return this;
19
19
  }
20
- createSerializer() {
21
- return new MarkdownSerializer_1.MarkdownSerializer(tslib_1.__classPrivateFieldGet(this, _SerializerTokensRegistry_nodes, "f"), tslib_1.__classPrivateFieldGet(this, _SerializerTokensRegistry_marks, "f"));
20
+ createSerializer(dynamicModifier) {
21
+ return new MarkdownSerializer_1.MarkdownSerializer(tslib_1.__classPrivateFieldGet(this, _SerializerTokensRegistry_nodes, "f"), tslib_1.__classPrivateFieldGet(this, _SerializerTokensRegistry_marks, "f"), dynamicModifier);
22
22
  }
23
23
  }
24
24
  exports.SerializerTokensRegistry = SerializerTokensRegistry;
@@ -9,3 +9,5 @@ export type { Extension, ExtensionAuto, ExtensionWithOptions, ExtensionDeps, Ext
9
9
  export type { Parser, ParserToken } from './types/parser';
10
10
  export type { Serializer, SerializerState, SerializerNodeToken, SerializerMarkToken, } from './types/serializer';
11
11
  export type { NodeViewConstructor, MarkViewConstructor } from './types/node-views';
12
+ export type { MarkdownParserDynamicModifierConfig } from './markdown/MarkdownParser';
13
+ export type { MarkdownSerializerDynamicModifierConfig } from './markdown/MarkdownSerializerDynamicModifier';
@@ -1,9 +1,10 @@
1
1
  import type { Match } from 'linkify-it';
2
2
  import type MarkdownIt from 'markdown-it';
3
+ import type Token from 'markdown-it/lib/token';
3
4
  import { Mark, Node, NodeType, Schema } from 'prosemirror-model';
4
5
  import type { Parser, ParserToken } from '../types/parser';
5
6
  import { TransformFn } from './ProseMirrorTransformer';
6
- declare type TokenAttrs = {
7
+ export declare type TokenAttrs = {
7
8
  [name: string]: unknown;
8
9
  };
9
10
  export declare class MarkdownParser implements Parser {
@@ -17,7 +18,8 @@ export declare class MarkdownParser implements Parser {
17
18
  tokens: Record<string, ParserToken>;
18
19
  tokenizer: MarkdownIt;
19
20
  pmTransformers: TransformFn[];
20
- constructor(schema: Schema, tokenizer: MarkdownIt, tokens: Record<string, ParserToken>, pmTransformers: TransformFn[]);
21
+ dynamicModifier: MarkdownParserDynamicModifier | null;
22
+ constructor(schema: Schema, tokenizer: MarkdownIt, tokens: Record<string, ParserToken>, pmTransformers: TransformFn[], dynamicModifier?: MarkdownParserDynamicModifier);
21
23
  validateLink(url: string): boolean;
22
24
  normalizeLink(url: string): string;
23
25
  normalizeLinkText(url: string): string;
@@ -30,6 +32,7 @@ export declare class MarkdownParser implements Parser {
30
32
  private getTokenType;
31
33
  private handlePrimitiveToken;
32
34
  private handleMark;
35
+ private getNodeSchema;
33
36
  private handleNode;
34
37
  private handleBlock;
35
38
  private handleToken;
@@ -41,4 +44,5 @@ export declare class MarkdownParser implements Parser {
41
44
  private closeMark;
42
45
  private parseTokens;
43
46
  }
44
- export {};
47
+ export declare type ProcessNodeAttrs = (token: Token, attrs: TokenAttrs, allowedAttrs?: string[]) => TokenAttrs;
48
+ export declare type ProcessNode = (node: Node) => Node;
@@ -1,6 +1,6 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.MarkdownParser = void 0;
3
+ exports.MarkdownParserDynamicModifier = exports.MarkdownParser = void 0;
4
4
  const prosemirror_model_1 = require("prosemirror-model");
5
5
  const logger_1 = require("../../logger");
6
6
  const ProseMirrorTransformer_1 = require("./ProseMirrorTransformer");
@@ -12,14 +12,23 @@ var TokenType;
12
12
  TokenType["close"] = "close";
13
13
  TokenType["default"] = "default";
14
14
  })(TokenType || (TokenType = {}));
15
+ /**
16
+ * Remove suffixes from the node name.
17
+ * Crops specified `openSuffix` and `closeSuffix` from the end of the given `tokName`.
18
+ */
19
+ function cropNodeName(tokName, openSuffix, closeSuffix) {
20
+ const regex = new RegExp(`(${openSuffix})$|(${closeSuffix})$`);
21
+ return tokName.replace(regex, '');
22
+ }
15
23
  class MarkdownParser {
16
- constructor(schema, tokenizer, tokens, pmTransformers) {
24
+ constructor(schema, tokenizer, tokens, pmTransformers, dynamicModifier) {
17
25
  this.stack = [];
18
26
  this.schema = schema;
19
27
  this.marks = prosemirror_model_1.Mark.none;
20
28
  this.tokens = tokens;
21
29
  this.tokenizer = tokenizer;
22
30
  this.pmTransformers = pmTransformers;
31
+ this.dynamicModifier = dynamicModifier !== null && dynamicModifier !== void 0 ? dynamicModifier : null;
23
32
  }
24
33
  validateLink(url) {
25
34
  return this.tokenizer.validateLink(url);
@@ -40,6 +49,9 @@ class MarkdownParser {
40
49
  let mdItTokens;
41
50
  try {
42
51
  mdItTokens = this.tokenizer.parse(text, {});
52
+ if (this.dynamicModifier) {
53
+ mdItTokens = this.dynamicModifier.processTokens(mdItTokens, text);
54
+ }
43
55
  }
44
56
  catch (err) {
45
57
  const e = err;
@@ -68,11 +80,20 @@ class MarkdownParser {
68
80
  }
69
81
  //#region helpers
70
82
  getTokenAttrs(token, tokenSpec, tokenStream, i) {
71
- if (tokenSpec.getAttrs)
72
- return tokenSpec.getAttrs(token, tokenStream, i);
73
- else if (tokenSpec.attrs instanceof Function)
74
- return tokenSpec.attrs(token);
75
- return tokenSpec.attrs;
83
+ let attrs = {};
84
+ if (tokenSpec.getAttrs) {
85
+ attrs = tokenSpec.getAttrs(token, tokenStream, i);
86
+ }
87
+ else if (tokenSpec.attrs instanceof Function) {
88
+ attrs = tokenSpec.attrs(token);
89
+ }
90
+ else {
91
+ attrs = tokenSpec.attrs;
92
+ }
93
+ if (this.dynamicModifier) {
94
+ attrs = this.dynamicModifier.processAttrs(token, attrs !== null && attrs !== void 0 ? attrs : {});
95
+ }
96
+ return attrs;
76
97
  }
77
98
  getTokenSpec(token) {
78
99
  var _a;
@@ -80,12 +101,14 @@ class MarkdownParser {
80
101
  let tokName = ((_a = token.meta) === null || _a === void 0 ? void 0 : _a['pm-node']) || token.type;
81
102
  // Cropping _open and _close from node name end
82
103
  // e.g. paragraph_open -> paragraph
83
- tokName = tokName.replace(new RegExp(`(${openSuffix})$|(${closeSuffix})$`), '');
104
+ tokName = cropNodeName(tokName, openSuffix, closeSuffix);
84
105
  let tokenSpec;
85
- if (tokName in this.tokens)
106
+ if (tokName in this.tokens) {
86
107
  tokenSpec = this.tokens[tokName];
87
- if (!tokenSpec)
108
+ }
109
+ if (!tokenSpec) {
88
110
  throw new RangeError(`No token spec for token: ${JSON.stringify(token)}`);
111
+ }
89
112
  return tokenSpec;
90
113
  }
91
114
  // Getting token type from its name
@@ -139,14 +162,18 @@ class MarkdownParser {
139
162
  }
140
163
  }
141
164
  }
165
+ getNodeSchema(tokenSpec) {
166
+ const spec = this.schema.nodes[tokenSpec.name];
167
+ return spec;
168
+ }
142
169
  handleNode(_token, tokenSpec, attrs) {
143
- const schemaSpec = this.schema.nodes[tokenSpec.name];
170
+ const schemaSpec = this.getNodeSchema(tokenSpec);
144
171
  // Adding node as is, becasuse it doesn't contain content.
145
172
  this.addNode(schemaSpec, attrs);
146
173
  }
147
174
  handleBlock(token, tokenSpec, attrs) {
148
175
  var _a;
149
- const schemaSpec = this.schema.nodes[tokenSpec.name];
176
+ const schemaSpec = this.getNodeSchema(tokenSpec);
150
177
  if (tokenSpec.noCloseToken) {
151
178
  this.openNode(schemaSpec, attrs);
152
179
  if (tokenSpec.contentField === 'children' && ((_a = token.children) === null || _a === void 0 ? void 0 : _a.length)) {
@@ -189,9 +216,13 @@ class MarkdownParser {
189
216
  //#endregion
190
217
  //#region state methods
191
218
  addNode(type, attrs, content) {
192
- const node = type.createAndFill(attrs, content, this.marks);
193
- if (!node)
219
+ let node = type.createAndFill(attrs, content, this.marks);
220
+ if (!node) {
194
221
  return null;
222
+ }
223
+ if (this.dynamicModifier) {
224
+ node = this.dynamicModifier.processNodes(node);
225
+ }
195
226
  this.push(node);
196
227
  return node;
197
228
  }
@@ -200,11 +231,13 @@ class MarkdownParser {
200
231
  }
201
232
  closeNode() {
202
233
  // Marks operate within a node. Therefore, when we close the node, we reset the existing marks.
203
- if (this.marks.length)
234
+ if (this.marks.length) {
204
235
  this.marks = prosemirror_model_1.Mark.none;
236
+ }
205
237
  const info = this.stack.pop();
206
- if (info)
238
+ if (info) {
207
239
  return this.addNode(info.type, info.attrs, info.content);
240
+ }
208
241
  return null;
209
242
  }
210
243
  addText(text) {
@@ -252,3 +285,39 @@ function maybeMerge(a, b) {
252
285
  function withoutTrailingNewline(str) {
253
286
  return str[str.length - 1] === '\n' || str.endsWith('\\n') ? str.slice(0, str.length - 1) : str;
254
287
  }
288
+ /** @internal */
289
+ class MarkdownParserDynamicModifier {
290
+ constructor(config) {
291
+ this.elementProcessors = new Map(Object.entries(config));
292
+ }
293
+ processTokens(tokens, rawMarkup) {
294
+ return tokens.map((token, index) => {
295
+ const processor = this.elementProcessors.get(cropNodeName(token.type, openSuffix, ''));
296
+ if (!processor || !processor.processToken || processor.processToken.length === 0) {
297
+ return token;
298
+ }
299
+ return processor.processToken.reduce((currentToken, process) => {
300
+ return process(currentToken, index, rawMarkup);
301
+ }, token);
302
+ });
303
+ }
304
+ processAttrs(token, attrs) {
305
+ const processor = this.elementProcessors.get(cropNodeName(token.type, openSuffix, ''));
306
+ if (!processor || !processor.processNodeAttrs || processor.processNodeAttrs.length === 0) {
307
+ return attrs;
308
+ }
309
+ return processor.processNodeAttrs.reduce((currentAttrs, process) => {
310
+ return process(token, currentAttrs);
311
+ }, attrs);
312
+ }
313
+ processNodes(node) {
314
+ const processor = this.elementProcessors.get(node.type.name);
315
+ if (!processor || !processor.processNode || processor.processNode.length === 0) {
316
+ return node;
317
+ }
318
+ return processor.processNode.reduce((currentNode, process) => {
319
+ return process(currentNode);
320
+ }, node);
321
+ }
322
+ }
323
+ exports.MarkdownParserDynamicModifier = MarkdownParserDynamicModifier;
@@ -1,13 +1,14 @@
1
1
  export class MarkdownSerializer {
2
- constructor(nodes: any, marks: any);
2
+ constructor(nodes: any, marks: any, dynamicModifier: any);
3
3
  nodes: any;
4
4
  marks: any;
5
+ dynamicModifier: any;
5
6
  serialize(content: any, options: any): string;
6
7
  containsNode(nodeName: any): boolean;
7
8
  containsMark(markName: any): boolean;
8
9
  }
9
10
  export class MarkdownSerializerState {
10
- constructor(nodes: any, marks: any, options: any);
11
+ constructor(nodes: any, marks: any, options: any, dynamicModifier: any);
11
12
  nodes: any;
12
13
  marks: any;
13
14
  delim: string;
@@ -20,6 +21,7 @@ export class MarkdownSerializerState {
20
21
  /** @type {Boolean} */
21
22
  escapeWhitespace: boolean;
22
23
  options: any;
24
+ dynamicModifier: any;
23
25
  setNoAutoBlank(): void;
24
26
  unsetNoAutoBlank(): void;
25
27
  flushClose(size: any): void;
@@ -39,18 +39,19 @@ class MarkdownSerializer {
39
39
  // outside the marks. This is necessary for emphasis marks as
40
40
  // CommonMark does not permit enclosing whitespace inside emphasis
41
41
  // marks, see: http://spec.commonmark.org/0.26/#example-330
42
- constructor(nodes, marks) {
42
+ constructor(nodes, marks, dynamicModifier) {
43
43
  // :: Object<(MarkdownSerializerState, Node)> The node serializer
44
44
  // functions for this serializer.
45
45
  this.nodes = nodes;
46
46
  // :: Object The mark serializer info.
47
47
  this.marks = marks;
48
+ this.dynamicModifier = dynamicModifier;
48
49
  }
49
50
  // :: (Node, ?Object) → string
50
51
  // Serialize the content of the given node to
51
52
  // [CommonMark](http://commonmark.org/).
52
53
  serialize(content, options) {
53
- const state = new MarkdownSerializerState(this.nodes, this.marks, options);
54
+ const state = new MarkdownSerializerState(this.nodes, this.marks, options, this.dynamicModifier);
54
55
  state.renderContent(content);
55
56
  return state.out;
56
57
  }
@@ -69,7 +70,7 @@ exports.MarkdownSerializer = MarkdownSerializer;
69
70
  // node and mark serialization methods (see `toMarkdown`).
70
71
  // prettier-ignore
71
72
  class MarkdownSerializerState {
72
- constructor(nodes, marks, options) {
73
+ constructor(nodes, marks, options, dynamicModifier) {
73
74
  this.nodes = nodes;
74
75
  this.marks = marks;
75
76
  this.delim = this.out = '';
@@ -87,6 +88,7 @@ class MarkdownSerializerState {
87
88
  // on a node level by specifying a tight attribute on the node.
88
89
  // Defaults to false.
89
90
  this.options = options || {};
91
+ this.dynamicModifier = dynamicModifier;
90
92
  if (typeof this.options.tightLists === 'undefined') {
91
93
  this.options.tightLists = false;
92
94
  }
@@ -177,11 +179,19 @@ class MarkdownSerializerState {
177
179
  // :: (Node)
178
180
  // Render the given node as a block.
179
181
  render(node, parent, index) {
180
- if (typeof parent === 'number')
182
+ if (typeof parent === 'number') {
181
183
  throw new Error('!');
182
- if (!this.nodes[node.type.name])
184
+ }
185
+ if (!this.nodes[node.type.name]) {
183
186
  throw new Error('Token type `' + node.type.name + '` not supported by Markdown renderer');
184
- this.nodes[node.type.name](this, node, parent, index);
187
+ }
188
+ const callback = this.nodes[node.type.name];
189
+ if (this.dynamicModifier) {
190
+ this.dynamicModifier.processNode(this, node, parent, index, callback);
191
+ }
192
+ else {
193
+ callback(this, node, parent, index);
194
+ }
185
195
  }
186
196
  // :: (Node)
187
197
  // Render the contents of `parent` as block nodes.
@@ -0,0 +1,47 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.MarkdownSerializerDynamicModifier = void 0;
4
+ /**
5
+ * Class MarkdownSerializerDynamicModifier
6
+ *
7
+ * Provides a mechanism for dynamic modification of node serialization during conversion of ProseMirror nodes
8
+ * to a markdown-like format. It allows sequential processing of nodes by applying a series of custom handlers:
9
+ *
10
+ * - `processNode`: An array of handlers that process nodes sequentially, each modifying the output.
11
+ *
12
+ * Example:
13
+ * ```ts
14
+ * const serializerModifier = new MarkdownSerializerDynamicModifier({
15
+ * paragraph: {
16
+ * processNode: [
17
+ * (state, node, parent, index, callback) => {
18
+ * // Custom modifications can be performed here.
19
+ * callback(state, node, parent, index);
20
+ * },
21
+ * ],
22
+ * },
23
+ * });
24
+ * ```
25
+ *
26
+ * This class extends the functionality of a MarkdownSerializer for scenarios such as:
27
+ * - Customizing the serialization output.
28
+ * - Logging or modifying node content during serialization.
29
+ */
30
+ /** @internal */
31
+ class MarkdownSerializerDynamicModifier {
32
+ constructor(config) {
33
+ this.nodeProcessors = new Map(Object.entries(config));
34
+ }
35
+ processNode(state, node, parent, index, callback) {
36
+ const nodeType = this.nodeProcessors.get(node.type.name);
37
+ if (!nodeType || !nodeType.processNode || nodeType.processNode.length === 0) {
38
+ callback(state, node, parent, index);
39
+ }
40
+ else {
41
+ nodeType.processNode.forEach((process) => {
42
+ process(state, node, parent, index, callback);
43
+ });
44
+ }
45
+ }
46
+ }
47
+ exports.MarkdownSerializerDynamicModifier = MarkdownSerializerDynamicModifier;
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,2 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
@@ -0,0 +1,9 @@
1
+ import { SchemaDynamicModifierConfig } from '../SchemaDynamicModifier';
2
+ import { MarkdownParserDynamicModifierConfig } from '../markdown/MarkdownParser';
3
+ import { MarkdownSerializerDynamicModifierConfig } from '../markdown/MarkdownSerializerDynamicModifier';
4
+ import { DynamicModifiers } from '../types/dynamicModifiers';
5
+ export declare function convertDynamicModifiersConfigs(modifiers: DynamicModifiers[]): {
6
+ parser: MarkdownParserDynamicModifierConfig;
7
+ schema: SchemaDynamicModifierConfig;
8
+ serializer: MarkdownSerializerDynamicModifierConfig;
9
+ };
@@ -0,0 +1,48 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.convertDynamicModifiersConfigs = void 0;
4
+ function convertDynamicModifiersConfigs(modifiers) {
5
+ const parser = {};
6
+ const schema = {};
7
+ const serializer = {};
8
+ modifiers.forEach((modifier) => {
9
+ var _a, _b, _c, _d;
10
+ switch (modifier.type) {
11
+ case 'parserToken': {
12
+ const { tokenName, process } = modifier;
13
+ parser[tokenName] = parser[tokenName] || {};
14
+ parser[tokenName].processToken = parser[tokenName].processToken || [];
15
+ (_a = parser[tokenName].processToken) === null || _a === void 0 ? void 0 : _a.push(process);
16
+ break;
17
+ }
18
+ case 'parserNodeAttrs': {
19
+ const { tokenName, process } = modifier;
20
+ parser[tokenName] = parser[tokenName] || {};
21
+ parser[tokenName].processNodeAttrs = parser[tokenName].processNodeAttrs || [];
22
+ (_b = parser[tokenName].processNodeAttrs) === null || _b === void 0 ? void 0 : _b.push(process);
23
+ break;
24
+ }
25
+ case 'parserNode': {
26
+ const { nodeName, process } = modifier;
27
+ parser[nodeName] = parser[nodeName] || {};
28
+ parser[nodeName].processNode = parser[nodeName].processNode || [];
29
+ (_c = parser[nodeName].processNode) === null || _c === void 0 ? void 0 : _c.push(process);
30
+ break;
31
+ }
32
+ case 'serializerNode': {
33
+ const { nodeName, process } = modifier;
34
+ serializer[nodeName] = serializer[nodeName] || {};
35
+ serializer[nodeName].processNode = serializer[nodeName].processNode || [];
36
+ (_d = serializer[nodeName].processNode) === null || _d === void 0 ? void 0 : _d.push(process);
37
+ break;
38
+ }
39
+ case 'schemaNodeSpec': {
40
+ const { nodeName, allowedAttrs } = modifier;
41
+ schema[nodeName] = { allowedAttrs };
42
+ break;
43
+ }
44
+ }
45
+ });
46
+ return { parser, schema, serializer };
47
+ }
48
+ exports.convertDynamicModifiersConfigs = convertDynamicModifiersConfigs;
@@ -1,7 +1,7 @@
1
1
  import React from 'react';
2
2
  import { AutocompletePopupProps } from '../../../utils/autocomplete-popup';
3
3
  import type { CommandAction } from './types';
4
- export declare type CommandMenuItem = Pick<CommandAction, 'id' | 'title' | 'icon' | 'hotkey' | 'hint'>;
4
+ export declare type CommandMenuItem = Pick<CommandAction, 'id' | 'title' | 'icon' | 'hotkey' | 'hint' | 'preview'>;
5
5
  export declare type CommandMenuComponentProps = AutocompletePopupProps & {
6
6
  currentIndex?: number;
7
7
  items: readonly CommandMenuItem[];