@gravity-ui/markdown-editor 15.1.0 → 15.2.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.
- package/build/cjs/bundle/Editor.d.ts +3 -0
- package/build/cjs/bundle/Editor.js +21 -2
- package/build/cjs/bundle/Editor.js.map +1 -1
- package/build/cjs/bundle/MarkdownEditorView.js +2 -1
- package/build/cjs/bundle/MarkdownEditorView.js.map +1 -1
- package/build/cjs/bundle/MarkupEditorView.js +6 -1
- package/build/cjs/bundle/MarkupEditorView.js.map +1 -1
- package/build/cjs/bundle/MarkupManager.d.ts +3 -6
- package/build/cjs/bundle/MarkupManager.js +5 -5
- package/build/cjs/bundle/MarkupManager.js.map +1 -1
- package/build/cjs/bundle/WysiwygEditorView.js +6 -1
- package/build/cjs/bundle/WysiwygEditorView.js.map +1 -1
- package/build/cjs/bundle/types.d.ts +2 -0
- package/build/cjs/bundle/types.js.map +1 -1
- package/build/cjs/bundle/useMarkdownEditor.js +4 -2
- package/build/cjs/bundle/useMarkdownEditor.js.map +1 -1
- package/build/cjs/core/Editor.d.ts +3 -1
- package/build/cjs/core/Editor.js +6 -3
- package/build/cjs/core/Editor.js.map +1 -1
- package/build/cjs/core/ExtensionBuilder.d.ts +3 -1
- package/build/cjs/core/ExtensionBuilder.js +6 -1
- package/build/cjs/core/ExtensionBuilder.js.map +1 -1
- package/build/cjs/core/ExtensionsManager.d.ts +4 -2
- package/build/cjs/core/ExtensionsManager.js +6 -5
- package/build/cjs/core/ExtensionsManager.js.map +1 -1
- package/build/cjs/core/ParserTokensRegistry.d.ts +6 -0
- package/build/cjs/core/ParserTokensRegistry.js +9 -1
- package/build/cjs/core/ParserTokensRegistry.js.map +1 -1
- package/build/cjs/core/index.d.ts +1 -0
- package/build/cjs/core/index.js +3 -1
- package/build/cjs/core/index.js.map +1 -1
- package/build/cjs/core/markdown/MarkdownParser.d.ts +9 -1
- package/build/cjs/core/markdown/MarkdownParser.js +7 -3
- package/build/cjs/core/markdown/MarkdownParser.js.map +1 -1
- package/build/cjs/core/utils/logger.d.ts +3 -0
- package/build/cjs/core/utils/logger.js +12 -0
- package/build/cjs/core/utils/logger.js.map +1 -0
- package/build/cjs/core/utils/metrics.d.ts +2 -1
- package/build/cjs/core/utils/metrics.js +8 -2
- package/build/cjs/core/utils/metrics.js.map +1 -1
- package/build/cjs/extensions/behavior/Autocomplete/handler.d.ts +3 -1
- package/build/cjs/extensions/behavior/Autocomplete/handler.js +16 -10
- package/build/cjs/extensions/behavior/Autocomplete/handler.js.map +1 -1
- package/build/cjs/extensions/behavior/Autocomplete/index.js +1 -1
- package/build/cjs/extensions/behavior/Autocomplete/index.js.map +1 -1
- package/build/cjs/extensions/behavior/Clipboard/clipboard.d.ts +3 -1
- package/build/cjs/extensions/behavior/Clipboard/clipboard.js +31 -3
- package/build/cjs/extensions/behavior/Clipboard/clipboard.js.map +1 -1
- package/build/cjs/extensions/behavior/Clipboard/index.js +4 -0
- package/build/cjs/extensions/behavior/Clipboard/index.js.map +1 -1
- package/build/cjs/extensions/behavior/CommandMenu/handler.d.ts +3 -1
- package/build/cjs/extensions/behavior/CommandMenu/handler.js +6 -3
- package/build/cjs/extensions/behavior/CommandMenu/handler.js.map +1 -1
- package/build/cjs/extensions/behavior/CommandMenu/index.js +5 -3
- package/build/cjs/extensions/behavior/CommandMenu/index.js.map +1 -1
- package/build/cjs/extensions/behavior/EditorModeKeymap/index.js +13 -2
- package/build/cjs/extensions/behavior/EditorModeKeymap/index.js.map +1 -1
- package/build/cjs/extensions/behavior/FilePaste/index.d.ts +1 -1
- package/build/cjs/extensions/behavior/FilePaste/index.js +12 -0
- package/build/cjs/extensions/behavior/FilePaste/index.js.map +1 -1
- package/build/cjs/extensions/behavior/SelectionContext/index.js +3 -3
- package/build/cjs/extensions/behavior/SelectionContext/index.js.map +1 -1
- package/build/cjs/extensions/behavior/SelectionContext/tooltip.d.ts +3 -1
- package/build/cjs/extensions/behavior/SelectionContext/tooltip.js +7 -2
- package/build/cjs/extensions/behavior/SelectionContext/tooltip.js.map +1 -1
- package/build/cjs/extensions/behavior/utils/upload.d.ts +2 -0
- package/build/cjs/extensions/behavior/utils/upload.js +3 -0
- package/build/cjs/extensions/behavior/utils/upload.js.map +1 -1
- package/build/cjs/extensions/markdown/Breaks/index.js +2 -1
- package/build/cjs/extensions/markdown/Breaks/index.js.map +1 -1
- package/build/cjs/extensions/markdown/CodeBlock/CodeBlockHighlight/CodeBlockHighlight.js +2 -1
- package/build/cjs/extensions/markdown/CodeBlock/CodeBlockHighlight/CodeBlockHighlight.js.map +1 -1
- package/build/cjs/extensions/markdown/Html/index.js +2 -1
- package/build/cjs/extensions/markdown/Html/index.js.map +1 -1
- package/build/cjs/extensions/markdown/Link/paste-plugin.d.ts +1 -1
- package/build/cjs/extensions/markdown/Link/paste-plugin.js +11 -0
- package/build/cjs/extensions/markdown/Link/paste-plugin.js.map +1 -1
- package/build/cjs/extensions/yfm/ImgSize/ImagePaste/index.d.ts +1 -1
- package/build/cjs/extensions/yfm/ImgSize/ImagePaste/index.js +14 -0
- package/build/cjs/extensions/yfm/ImgSize/ImagePaste/index.js.map +1 -1
- package/build/cjs/extensions/yfm/ImgSize/ImagePaste/upload.js +6 -5
- package/build/cjs/extensions/yfm/ImgSize/ImagePaste/upload.js.map +1 -1
- package/build/cjs/extensions/yfm/ImgSize/utils.d.ts +2 -1
- package/build/cjs/extensions/yfm/ImgSize/utils.js +3 -2
- package/build/cjs/extensions/yfm/ImgSize/utils.js.map +1 -1
- package/build/cjs/extensions/yfm/YfmFile/YfmFilePaste/index.d.ts +1 -1
- package/build/cjs/extensions/yfm/YfmFile/YfmFilePaste/index.js +15 -1
- package/build/cjs/extensions/yfm/YfmFile/YfmFilePaste/index.js.map +1 -1
- package/build/cjs/i18n/yfm-note/index.d.ts +1 -1
- package/build/cjs/logger.d.ts +75 -0
- package/build/cjs/logger.js +89 -1
- package/build/cjs/logger.js.map +1 -1
- package/build/cjs/markup/codemirror/create.d.ts +2 -0
- package/build/cjs/markup/codemirror/create.js +15 -4
- package/build/cjs/markup/codemirror/create.js.map +1 -1
- package/build/cjs/markup/codemirror/files-upload-plugin/plugin.js +13 -0
- package/build/cjs/markup/codemirror/files-upload-plugin/plugin.js.map +1 -1
- package/build/cjs/markup/codemirror/logger-facet.d.ts +3 -0
- package/build/cjs/markup/codemirror/logger-facet.js +9 -0
- package/build/cjs/markup/codemirror/logger-facet.js.map +1 -0
- package/build/cjs/utils/event-emitter.d.ts +1 -0
- package/build/cjs/utils/event-emitter.js +3 -0
- package/build/cjs/utils/event-emitter.js.map +1 -1
- package/build/cjs/utils/facet.d.ts +1 -0
- package/build/cjs/utils/facet.js +33 -0
- package/build/cjs/utils/facet.js.map +1 -0
- package/build/cjs/utils/keymap.js +7 -2
- package/build/cjs/utils/keymap.js.map +1 -1
- package/build/cjs/version.js +1 -1
- package/build/cjs/version.js.map +1 -1
- package/build/esm/bundle/Editor.d.ts +3 -0
- package/build/esm/bundle/Editor.js +22 -3
- package/build/esm/bundle/Editor.js.map +1 -1
- package/build/esm/bundle/MarkdownEditorView.js +3 -2
- package/build/esm/bundle/MarkdownEditorView.js.map +1 -1
- package/build/esm/bundle/MarkupEditorView.js +7 -2
- package/build/esm/bundle/MarkupEditorView.js.map +1 -1
- package/build/esm/bundle/MarkupManager.d.ts +3 -6
- package/build/esm/bundle/MarkupManager.js +5 -5
- package/build/esm/bundle/MarkupManager.js.map +1 -1
- package/build/esm/bundle/WysiwygEditorView.js +7 -2
- package/build/esm/bundle/WysiwygEditorView.js.map +1 -1
- package/build/esm/bundle/types.d.ts +2 -0
- package/build/esm/bundle/types.js.map +1 -1
- package/build/esm/bundle/useMarkdownEditor.js +5 -3
- package/build/esm/bundle/useMarkdownEditor.js.map +1 -1
- package/build/esm/core/Editor.d.ts +3 -1
- package/build/esm/core/Editor.js +6 -3
- package/build/esm/core/Editor.js.map +1 -1
- package/build/esm/core/ExtensionBuilder.d.ts +3 -1
- package/build/esm/core/ExtensionBuilder.js +6 -1
- package/build/esm/core/ExtensionBuilder.js.map +1 -1
- package/build/esm/core/ExtensionsManager.d.ts +4 -2
- package/build/esm/core/ExtensionsManager.js +6 -5
- package/build/esm/core/ExtensionsManager.js.map +1 -1
- package/build/esm/core/ParserTokensRegistry.d.ts +6 -0
- package/build/esm/core/ParserTokensRegistry.js +9 -1
- package/build/esm/core/ParserTokensRegistry.js.map +1 -1
- package/build/esm/core/index.d.ts +1 -0
- package/build/esm/core/index.js +1 -0
- package/build/esm/core/index.js.map +1 -1
- package/build/esm/core/markdown/MarkdownParser.d.ts +9 -1
- package/build/esm/core/markdown/MarkdownParser.js +7 -3
- package/build/esm/core/markdown/MarkdownParser.js.map +1 -1
- package/build/esm/core/utils/logger.d.ts +3 -0
- package/build/esm/core/utils/logger.js +8 -0
- package/build/esm/core/utils/logger.js.map +1 -0
- package/build/esm/core/utils/metrics.d.ts +2 -1
- package/build/esm/core/utils/metrics.js +8 -2
- package/build/esm/core/utils/metrics.js.map +1 -1
- package/build/esm/extensions/behavior/Autocomplete/handler.d.ts +3 -1
- package/build/esm/extensions/behavior/Autocomplete/handler.js +15 -9
- package/build/esm/extensions/behavior/Autocomplete/handler.js.map +1 -1
- package/build/esm/extensions/behavior/Autocomplete/index.js +1 -1
- package/build/esm/extensions/behavior/Autocomplete/index.js.map +1 -1
- package/build/esm/extensions/behavior/Clipboard/clipboard.d.ts +3 -1
- package/build/esm/extensions/behavior/Clipboard/clipboard.js +32 -4
- package/build/esm/extensions/behavior/Clipboard/clipboard.js.map +1 -1
- package/build/esm/extensions/behavior/Clipboard/index.js +4 -0
- package/build/esm/extensions/behavior/Clipboard/index.js.map +1 -1
- package/build/esm/extensions/behavior/CommandMenu/handler.d.ts +3 -1
- package/build/esm/extensions/behavior/CommandMenu/handler.js +7 -4
- package/build/esm/extensions/behavior/CommandMenu/handler.js.map +1 -1
- package/build/esm/extensions/behavior/CommandMenu/index.js +6 -4
- package/build/esm/extensions/behavior/CommandMenu/index.js.map +1 -1
- package/build/esm/extensions/behavior/EditorModeKeymap/index.js +13 -2
- package/build/esm/extensions/behavior/EditorModeKeymap/index.js.map +1 -1
- package/build/esm/extensions/behavior/FilePaste/index.d.ts +1 -1
- package/build/esm/extensions/behavior/FilePaste/index.js +12 -0
- package/build/esm/extensions/behavior/FilePaste/index.js.map +1 -1
- package/build/esm/extensions/behavior/SelectionContext/index.js +3 -3
- package/build/esm/extensions/behavior/SelectionContext/index.js.map +1 -1
- package/build/esm/extensions/behavior/SelectionContext/tooltip.d.ts +3 -1
- package/build/esm/extensions/behavior/SelectionContext/tooltip.js +8 -3
- package/build/esm/extensions/behavior/SelectionContext/tooltip.js.map +1 -1
- package/build/esm/extensions/behavior/utils/upload.d.ts +2 -0
- package/build/esm/extensions/behavior/utils/upload.js +3 -0
- package/build/esm/extensions/behavior/utils/upload.js.map +1 -1
- package/build/esm/extensions/markdown/Breaks/index.js +3 -2
- package/build/esm/extensions/markdown/Breaks/index.js.map +1 -1
- package/build/esm/extensions/markdown/CodeBlock/CodeBlockHighlight/CodeBlockHighlight.js +3 -2
- package/build/esm/extensions/markdown/CodeBlock/CodeBlockHighlight/CodeBlockHighlight.js.map +1 -1
- package/build/esm/extensions/markdown/Html/index.js +3 -2
- package/build/esm/extensions/markdown/Html/index.js.map +1 -1
- package/build/esm/extensions/markdown/Link/paste-plugin.d.ts +1 -1
- package/build/esm/extensions/markdown/Link/paste-plugin.js +11 -0
- package/build/esm/extensions/markdown/Link/paste-plugin.js.map +1 -1
- package/build/esm/extensions/yfm/ImgSize/ImagePaste/index.d.ts +1 -1
- package/build/esm/extensions/yfm/ImgSize/ImagePaste/index.js +14 -0
- package/build/esm/extensions/yfm/ImgSize/ImagePaste/index.js.map +1 -1
- package/build/esm/extensions/yfm/ImgSize/ImagePaste/upload.js +7 -6
- package/build/esm/extensions/yfm/ImgSize/ImagePaste/upload.js.map +1 -1
- package/build/esm/extensions/yfm/ImgSize/utils.d.ts +2 -1
- package/build/esm/extensions/yfm/ImgSize/utils.js +4 -3
- package/build/esm/extensions/yfm/ImgSize/utils.js.map +1 -1
- package/build/esm/extensions/yfm/YfmFile/YfmFilePaste/index.d.ts +1 -1
- package/build/esm/extensions/yfm/YfmFile/YfmFilePaste/index.js +15 -1
- package/build/esm/extensions/yfm/YfmFile/YfmFilePaste/index.js.map +1 -1
- package/build/esm/i18n/yfm-note/index.d.ts +1 -1
- package/build/esm/logger.d.ts +75 -0
- package/build/esm/logger.js +87 -0
- package/build/esm/logger.js.map +1 -1
- package/build/esm/markup/codemirror/create.d.ts +2 -0
- package/build/esm/markup/codemirror/create.js +16 -5
- package/build/esm/markup/codemirror/create.js.map +1 -1
- package/build/esm/markup/codemirror/files-upload-plugin/plugin.js +13 -0
- package/build/esm/markup/codemirror/files-upload-plugin/plugin.js.map +1 -1
- package/build/esm/markup/codemirror/logger-facet.d.ts +3 -0
- package/build/esm/markup/codemirror/logger-facet.js +6 -0
- package/build/esm/markup/codemirror/logger-facet.js.map +1 -0
- package/build/esm/utils/event-emitter.d.ts +1 -0
- package/build/esm/utils/event-emitter.js +3 -0
- package/build/esm/utils/event-emitter.js.map +1 -1
- package/build/esm/utils/facet.d.ts +1 -0
- package/build/esm/utils/facet.js +29 -0
- package/build/esm/utils/facet.js.map +1 -0
- package/build/esm/utils/keymap.js +7 -2
- package/build/esm/utils/keymap.js.map +1 -1
- package/build/esm/version.js +1 -1
- package/build/esm/version.js.map +1 -1
- package/package.json +1 -1
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import type { CommonEditor } from "../common/index.js";
|
|
2
2
|
import type { TransformFn } from "../core/markdown/ProseMirrorTransformer/index.js";
|
|
3
3
|
import type { ReactRenderStorage } from "../extensions/index.js";
|
|
4
|
+
import { type Logger2 } from "../logger.js";
|
|
4
5
|
import { type Receiver } from "../utils/index.js";
|
|
5
6
|
import type { DirectiveSyntaxContext } from "../utils/directive.js";
|
|
6
7
|
import type { MarkdownEditorMode as EditorMode, MarkdownEditorPreset as EditorPreset, MarkdownEditorOptions } from "./types.js";
|
|
@@ -27,6 +28,7 @@ export interface EventMap {
|
|
|
27
28
|
};
|
|
28
29
|
}
|
|
29
30
|
export interface Editor extends Receiver<EventMap>, CommonEditor {
|
|
31
|
+
readonly logger: Logger2.LogReceiver;
|
|
30
32
|
readonly currentMode: EditorMode;
|
|
31
33
|
readonly toolbarVisible: boolean;
|
|
32
34
|
setEditorMode(mode: EditorMode, opts?: SetEditorModeOptions): void;
|
|
@@ -41,6 +43,7 @@ export type ChangeEditorModeOptions = {
|
|
|
41
43
|
emit?: boolean;
|
|
42
44
|
};
|
|
43
45
|
export type EditorOptions = Pick<MarkdownEditorOptions, 'md' | 'initial' | 'handlers' | 'experimental' | 'markupConfig' | 'wysiwygConfig'> & {
|
|
46
|
+
logger: Logger2.ILogger;
|
|
44
47
|
renderStorage: ReactRenderStorage;
|
|
45
48
|
preset: EditorPreset;
|
|
46
49
|
directiveSyntax: DirectiveSyntaxContext;
|
|
@@ -14,6 +14,7 @@ const MarkupManager_1 = require("./MarkupManager.js");
|
|
|
14
14
|
const dynamicModifiers_1 = require("./config/dynamicModifiers.js");
|
|
15
15
|
/** @internal */
|
|
16
16
|
class EditorImpl extends utils_1.SafeEventEmitter {
|
|
17
|
+
#logger;
|
|
17
18
|
#markup;
|
|
18
19
|
#editorMode;
|
|
19
20
|
#toolbarVisible;
|
|
@@ -42,6 +43,9 @@ class EditorImpl extends utils_1.SafeEventEmitter {
|
|
|
42
43
|
// @ts-expect-error internal typing
|
|
43
44
|
return this.#wysiwygEditor?.view;
|
|
44
45
|
}
|
|
46
|
+
get logger() {
|
|
47
|
+
return this.#logger;
|
|
48
|
+
}
|
|
45
49
|
get currentMode() {
|
|
46
50
|
return this.#editorMode;
|
|
47
51
|
}
|
|
@@ -121,6 +125,7 @@ class EditorImpl extends utils_1.SafeEventEmitter {
|
|
|
121
125
|
const mdPreset = this.#preset === 'zero' || this.#preset === 'commonmark' ? this.#preset : 'default';
|
|
122
126
|
this.#wysiwygEditor = new core_1.WysiwygEditor({
|
|
123
127
|
mdPreset,
|
|
128
|
+
logger: this.logger.nested({ mode: 'wysiwyg' }),
|
|
124
129
|
initialContent: this.#markup,
|
|
125
130
|
extensions: this.#extensions,
|
|
126
131
|
pmTransformers: this.#pmTransformers,
|
|
@@ -139,6 +144,7 @@ class EditorImpl extends utils_1.SafeEventEmitter {
|
|
|
139
144
|
if (!this.#markupEditor) {
|
|
140
145
|
this.#markupEditor = new editor_1.Editor((0, markup_1.createCodemirror)({
|
|
141
146
|
doc: this.#markup,
|
|
147
|
+
logger: this.logger.nested({ mode: 'markup' }),
|
|
142
148
|
placeholder: this.#markupConfig.placeholder ?? (0, bundle_1.i18n)('markup_placeholder'),
|
|
143
149
|
onCancel: () => this.emit('cancel', null),
|
|
144
150
|
onSubmit: () => this.emit('submit', null),
|
|
@@ -183,10 +189,17 @@ class EditorImpl extends utils_1.SafeEventEmitter {
|
|
|
183
189
|
return this.#enableNewImageSizeCalculation;
|
|
184
190
|
}
|
|
185
191
|
constructor(opts) {
|
|
186
|
-
|
|
192
|
+
const { logger } = opts;
|
|
193
|
+
super({
|
|
194
|
+
onError: (error) => {
|
|
195
|
+
logger.error(error);
|
|
196
|
+
logger_1.globalLogger.error(error);
|
|
197
|
+
},
|
|
198
|
+
});
|
|
187
199
|
const { md = {}, initial = {}, handlers = {}, experimental = {}, markupConfig = {}, wysiwygConfig = {}, } = opts;
|
|
200
|
+
this.#logger = logger;
|
|
188
201
|
this.#modifiers = experimental.preserveMarkupFormatting
|
|
189
|
-
? (0, dynamicModifiers_1.createDynamicModifiers)(new MarkupManager_1.MarkupManager())
|
|
202
|
+
? (0, dynamicModifiers_1.createDynamicModifiers)(new MarkupManager_1.MarkupManager(this.logger.nested({ module: 'markup-manager' })))
|
|
190
203
|
: undefined;
|
|
191
204
|
this.#editorMode = initial.mode ?? 'wysiwyg';
|
|
192
205
|
this.#toolbarVisible = initial.toolbarVisible ?? true;
|
|
@@ -239,6 +252,12 @@ class EditorImpl extends utils_1.SafeEventEmitter {
|
|
|
239
252
|
if (this.#beforeEditorModeChange?.({ mode: opts.mode, reason: opts.reason }) === false) {
|
|
240
253
|
return;
|
|
241
254
|
}
|
|
255
|
+
this.logger.event({
|
|
256
|
+
event: 'mode-change',
|
|
257
|
+
prevMode: this.#editorMode,
|
|
258
|
+
nextMode: opts.mode,
|
|
259
|
+
reason: opts.reason,
|
|
260
|
+
});
|
|
242
261
|
this.currentMode = opts.mode;
|
|
243
262
|
this.emit('rerender', null);
|
|
244
263
|
if (emit) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Editor.js","sourceRoot":"../../../src","sources":["bundle/Editor.ts"],"names":[],"mappings":"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","sourcesContent":["import type {ReactNode} from 'react';\n\nimport {EditorView as CMEditorView} from '@codemirror/view';\nimport {TextSelection} from 'prosemirror-state';\nimport type {EditorView as PMEditorView} from 'prosemirror-view';\n\nimport type {CommonEditor, MarkupString} from '../common';\nimport {\n type ActionStorage,\n type EscapeConfig,\n WysiwygEditor,\n type WysiwygEditorOptions,\n} from '../core';\nimport type {TransformFn} from '../core/markdown/ProseMirrorTransformer';\nimport type {DynamicModifiers} from '../core/types/dynamicModifiers';\nimport type {ReactRenderStorage, RenderStorage} from '../extensions';\nimport {i18n} from '../i18n/bundle';\nimport {logger} from '../logger';\nimport {createCodemirror} from '../markup';\nimport {getAutocompleteConfig} from '../markup/codemirror/autocomplete';\nimport {type CodeEditor, Editor as MarkupEditor} from '../markup/editor';\nimport {type Emitter, type FileUploadHandler, type Receiver, SafeEventEmitter} from '../utils';\nimport type {DirectiveSyntaxContext} from '../utils/directive';\n\nimport {MarkupManager} from './MarkupManager';\nimport {createDynamicModifiers} from './config/dynamicModifiers';\nimport type {\n MarkdownEditorMode as EditorMode,\n MarkdownEditorPreset as EditorPreset,\n MarkdownEditorMdOptions,\n MarkdownEditorOptions,\n MarkdownEditorMarkupConfig as MarkupConfig,\n ParseInsertedUrlAsImage,\n RenderPreview,\n MarkdownEditorSplitMode as SplitMode,\n} from './types';\n\nexport type ToolbarActionData = {\n editorMode: EditorMode;\n id: string;\n attrs?: {[key: string]: any};\n};\n\nexport interface EventMap {\n change: null;\n cancel: null;\n submit: null;\n\n 'toolbar-action': ToolbarActionData;\n\n 'change-editor-mode': {mode: EditorMode};\n 'change-toolbar-visibility': {visible: boolean};\n 'change-split-mode-enabled': {splitModeEnabled: boolean};\n}\n\n// internal events\ninterface EventMapInt extends EventMap {\n rerender: null;\n 'rerender-toolbar': null;\n 'cm-scroll': {event: Event};\n}\n\nexport interface Editor extends Receiver<EventMap>, CommonEditor {\n readonly currentMode: EditorMode;\n readonly toolbarVisible: boolean;\n\n setEditorMode(mode: EditorMode, opts?: SetEditorModeOptions): void;\n\n moveCursor(position: 'start' | 'end' | {line: number}): void;\n\n /** @internal used in demo for dev-tools */\n readonly _wysiwygView?: PMEditorView;\n}\n\n/** @internal */\nexport interface EditorInt\n extends CommonEditor,\n Emitter<EventMapInt>,\n Receiver<EventMapInt>,\n ActionStorage,\n CodeEditor {\n readonly currentMode: EditorMode;\n readonly toolbarVisible: boolean;\n readonly splitModeEnabled: boolean;\n readonly splitMode: SplitMode;\n readonly preset: EditorPreset;\n readonly mdOptions: Readonly<MarkdownEditorMdOptions>;\n readonly directiveSyntax: DirectiveSyntaxContext;\n\n /** @internal used in demo for dev-tools */\n readonly _wysiwygView?: PMEditorView;\n\n readonly currentEditor: CommonEditor;\n readonly wysiwygEditor: WysiwygEditor;\n readonly markupEditor: MarkupEditor;\n\n readonly renderStorage: RenderStorage<ReactNode>;\n readonly fileUploadHandler?: FileUploadHandler;\n readonly needToSetDimensionsForUploadedImages: boolean;\n readonly disableHTMLParsingInMd?: boolean;\n\n readonly renderPreview?: RenderPreview;\n\n changeEditorMode(opts: ChangeEditorModeOptions): void;\n\n setEditorMode(mode: EditorMode, opts?: SetEditorModeOptions): void;\n\n moveCursor(position: 'start' | 'end' | {line: number}): void;\n\n changeToolbarVisibility(opts: {visible: boolean}): void;\n\n changeSplitModeEnabled(opts: {splitModeEnabled: boolean}): void;\n\n destroy(): void;\n}\n\ntype SetEditorModeOptions = Pick<ChangeEditorModeOptions, 'emit'>;\n\nexport type ChangeEditorModeOptions = {\n mode: EditorMode;\n reason: 'error-boundary' | 'settings' | 'manually';\n emit?: boolean;\n};\n\nexport type EditorOptions = Pick<\n MarkdownEditorOptions,\n 'md' | 'initial' | 'handlers' | 'experimental' | 'markupConfig' | 'wysiwygConfig'\n> & {\n renderStorage: ReactRenderStorage;\n preset: EditorPreset;\n directiveSyntax: DirectiveSyntaxContext;\n pmTransformers: TransformFn[];\n};\n\n/** @internal */\nexport class EditorImpl extends SafeEventEmitter<EventMapInt> implements EditorInt {\n #markup: MarkupString;\n #editorMode: EditorMode;\n #toolbarVisible: boolean;\n #splitModeEnabled: boolean;\n #splitMode: SplitMode;\n #renderPreview?: RenderPreview;\n #wysiwygEditor?: WysiwygEditor;\n #markupEditor?: MarkupEditor;\n #markupConfig: MarkupConfig;\n #escapeConfig?: EscapeConfig;\n #mdOptions: Readonly<MarkdownEditorMdOptions>;\n #pmTransformers: TransformFn[] = [];\n #preserveEmptyRows: boolean;\n #modifiers?: DynamicModifiers[];\n\n readonly #preset: EditorPreset;\n #extensions?: WysiwygEditorOptions['extensions'];\n #renderStorage: ReactRenderStorage;\n #fileUploadHandler?: FileUploadHandler;\n #parseInsertedUrlAsImage?: ParseInsertedUrlAsImage;\n #needToSetDimensionsForUploadedImages: boolean;\n #enableNewImageSizeCalculation: boolean;\n #directiveSyntax: DirectiveSyntaxContext;\n #prepareRawMarkup?: (value: MarkupString) => MarkupString;\n #beforeEditorModeChange?: (\n options: Pick<ChangeEditorModeOptions, 'mode' | 'reason'>,\n ) => boolean | undefined;\n\n get _wysiwygView(): PMEditorView {\n // @ts-expect-error internal typing\n return this.#wysiwygEditor?.view;\n }\n\n get currentMode(): EditorMode {\n return this.#editorMode;\n }\n\n private set currentMode(newMode: EditorMode) {\n switch (newMode) {\n case 'markup': {\n this.#editorMode = newMode;\n if (this.#wysiwygEditor) {\n const markupEditorValue = this.#markupEditor?.getValue();\n const wysiwygEditorValue = this.#wysiwygEditor.getValue();\n if (\n !markupEditorValue ||\n this.shouldReplaceMarkupEditorValue(markupEditorValue, wysiwygEditorValue)\n ) {\n this.#markup = wysiwygEditorValue;\n } else {\n this.#markup = markupEditorValue;\n }\n }\n if (this.#markupEditor) this.#markupEditor.replace(this.#markup);\n break;\n }\n case 'wysiwyg': {\n this.#editorMode = newMode;\n if (this.#markupEditor) {\n const value = this.#markupEditor.getValue();\n this.#markup = this.#prepareRawMarkup?.(value) ?? value;\n } else if (this.#prepareRawMarkup) {\n this.#markup = this.#prepareRawMarkup(this.#markup);\n }\n if (this.#wysiwygEditor) this.#wysiwygEditor.replace(this.#markup);\n break;\n }\n default:\n throw new Error('Unknown editor mode: ' + newMode);\n }\n setTimeout(() => {\n this.currentEditor.focus();\n }, 30);\n }\n\n get toolbarVisible(): boolean {\n return this.#toolbarVisible;\n }\n\n get splitModeEnabled(): boolean {\n return this.#splitModeEnabled;\n }\n\n get splitMode(): SplitMode {\n return this.#splitMode;\n }\n\n get preset(): EditorPreset {\n return this.#preset;\n }\n\n get mdOptions(): Readonly<MarkdownEditorMdOptions> {\n return this.#mdOptions;\n }\n\n get directiveSyntax(): DirectiveSyntaxContext {\n return this.#directiveSyntax;\n }\n\n get renderPreview(): RenderPreview | undefined {\n return this.#renderPreview;\n }\n\n get currentEditor(): CommonEditor {\n const mode = this.currentMode;\n switch (mode) {\n case 'markup':\n return this.markupEditor;\n case 'wysiwyg':\n return this.wysiwygEditor;\n default:\n throw new Error('Unknown editor mode: ' + mode);\n }\n }\n\n get wysiwygEditor(): WysiwygEditor {\n if (!this.#wysiwygEditor) {\n const mdPreset: NonNullable<WysiwygEditorOptions['mdPreset']> =\n this.#preset === 'zero' || this.#preset === 'commonmark' ? this.#preset : 'default';\n this.#wysiwygEditor = new WysiwygEditor({\n mdPreset,\n initialContent: this.#markup,\n extensions: this.#extensions,\n pmTransformers: this.#pmTransformers,\n modifiers: this.#modifiers,\n allowHTML: this.#mdOptions.html,\n linkify: this.#mdOptions.linkify,\n linkifyTlds: this.#mdOptions.linkifyTlds,\n escapeConfig: this.#escapeConfig,\n onChange: () => this.emit('rerender-toolbar', null),\n onDocChange: () => this.emit('change', null),\n });\n }\n return this.#wysiwygEditor;\n }\n\n get markupEditor(): MarkupEditor {\n if (!this.#markupEditor) {\n this.#markupEditor = new MarkupEditor(\n createCodemirror({\n doc: this.#markup,\n placeholder: this.#markupConfig.placeholder ?? i18n('markup_placeholder'),\n onCancel: () => this.emit('cancel', null),\n onSubmit: () => this.emit('submit', null),\n onChange: () => this.emit('rerender-toolbar', null),\n onDocChange: () => this.emit('change', null),\n onScroll: (event) => this.emit('cm-scroll', {event}),\n reactRenderer: this.#renderStorage,\n uploadHandler: this.fileUploadHandler,\n parseInsertedUrlAsImage: this.parseInsertedUrlAsImage,\n needImageDimensions: this.needToSetDimensionsForUploadedImages,\n parseHtmlOnPaste: this.#markupConfig.parseHtmlOnPaste,\n enableNewImageSizeCalculation: this.enableNewImageSizeCalculation,\n extensions: this.#markupConfig.extensions,\n disabledExtensions: this.#markupConfig.disabledExtensions,\n keymaps: this.#markupConfig.keymaps,\n preserveEmptyRows: this.#preserveEmptyRows,\n yfmLangOptions: {\n languageData: getAutocompleteConfig({\n preserveEmptyRows: this.#preserveEmptyRows,\n }).concat(this.#markupConfig?.languageData || []),\n },\n autocompletion: this.#markupConfig.autocompletion,\n directiveSyntax: this.directiveSyntax,\n receiver: this,\n }),\n );\n }\n return this.#markupEditor;\n }\n\n get renderStorage(): RenderStorage<ReactNode> {\n return this.#renderStorage;\n }\n\n get fileUploadHandler(): FileUploadHandler | undefined {\n return this.#fileUploadHandler;\n }\n\n get parseInsertedUrlAsImage() {\n return this.#parseInsertedUrlAsImage;\n }\n\n get needToSetDimensionsForUploadedImages(): boolean {\n return this.#needToSetDimensionsForUploadedImages;\n }\n\n get enableNewImageSizeCalculation(): boolean {\n return this.#enableNewImageSizeCalculation;\n }\n\n constructor(opts: EditorOptions) {\n super({onError: logger.error.bind(logger)});\n\n const {\n md = {},\n initial = {},\n handlers = {},\n experimental = {},\n markupConfig = {},\n wysiwygConfig = {},\n } = opts;\n\n this.#modifiers = experimental.preserveMarkupFormatting\n ? createDynamicModifiers(new MarkupManager())\n : undefined;\n\n this.#editorMode = initial.mode ?? 'wysiwyg';\n this.#toolbarVisible = initial.toolbarVisible ?? true;\n this.#splitMode = (markupConfig.renderPreview && markupConfig.splitMode) ?? false;\n this.#splitModeEnabled = (this.#splitMode && initial.splitModeEnabled) ?? false;\n this.#renderPreview = markupConfig.renderPreview;\n\n this.#markup = initial.markup ?? '';\n\n this.#preset = opts.preset ?? 'full';\n this.#pmTransformers = opts.pmTransformers;\n this.#mdOptions = md;\n this.#extensions = wysiwygConfig.extensions;\n this.#markupConfig = {...opts.markupConfig};\n\n this.#renderStorage = opts.renderStorage;\n this.#fileUploadHandler = handlers.uploadFile;\n this.#parseInsertedUrlAsImage = markupConfig.parseInsertedUrlAsImage;\n this.#needToSetDimensionsForUploadedImages = Boolean(\n experimental.needToSetDimensionsForUploadedImages,\n );\n this.#directiveSyntax = opts.directiveSyntax;\n this.#enableNewImageSizeCalculation = Boolean(experimental.enableNewImageSizeCalculation);\n this.#preserveEmptyRows = experimental.preserveEmptyRows || false;\n this.#prepareRawMarkup = experimental.prepareRawMarkup;\n this.#escapeConfig = wysiwygConfig.escapeConfig;\n this.#beforeEditorModeChange = experimental.beforeEditorModeChange;\n }\n\n // ---> implements CodeEditor\n\n get cm() {\n return this.markupEditor.cm;\n }\n\n // <--- implements CodeEditor\n\n // ---> implements ActionStorage\n get actions(): WysiwygEditor.Actions {\n return this.wysiwygEditor.actions;\n }\n\n action<T extends keyof WysiwygEditor.Actions>(actionName: T): WysiwygEditor.Actions[T] {\n return this.wysiwygEditor.action(actionName);\n }\n\n // <--- implements ActionStorage\n\n destroy() {\n this.#wysiwygEditor?.destroy();\n this.#markupEditor?.codemirror.destroy();\n\n this.#markupEditor = undefined;\n this.#markupEditor = undefined;\n this.#wysiwygEditor = undefined;\n }\n\n setEditorMode(mode: EditorMode, opts?: SetEditorModeOptions): void {\n this.changeEditorMode({mode, reason: 'manually', emit: opts?.emit});\n }\n\n changeEditorMode({emit = true, ...opts}: ChangeEditorModeOptions): void {\n if (this.#editorMode === opts.mode) return;\n\n if (this.#beforeEditorModeChange?.({mode: opts.mode, reason: opts.reason}) === false) {\n return;\n }\n\n this.currentMode = opts.mode;\n this.emit('rerender', null);\n\n if (emit) {\n this.emit('change-editor-mode', opts);\n }\n }\n\n changeToolbarVisibility(opts: {visible: boolean}): void {\n this.#toolbarVisible = opts.visible;\n this.emit('rerender', null);\n this.emit('change-toolbar-visibility', opts);\n }\n\n changeSplitModeEnabled(opts: {splitModeEnabled: boolean}): void {\n if (this.#splitModeEnabled === opts.splitModeEnabled) return;\n this.#splitModeEnabled = opts.splitModeEnabled;\n this.emit('rerender', null);\n this.emit('change-split-mode-enabled', opts);\n }\n\n focus(): void {\n return this.currentEditor.focus();\n }\n\n hasFocus(): boolean {\n return this.currentEditor.hasFocus();\n }\n\n getValue: () => MarkupString = () => this.currentEditor.getValue();\n\n isEmpty(): boolean {\n return this.currentEditor.isEmpty();\n }\n\n clear(): void {\n return this.currentEditor.clear();\n }\n\n replace(newMarkup: MarkupString): void {\n return this.currentEditor.replace(newMarkup);\n }\n\n prepend(markup: MarkupString): void {\n return this.currentEditor.prepend(markup);\n }\n\n append(markup: MarkupString): void {\n return this.currentEditor.append(markup);\n }\n\n moveCursor(\n position:\n | 'start'\n | 'end'\n | {\n /** 0-based line number */\n line: number;\n },\n ): void {\n if (typeof position === 'object') {\n return this.moveCursorToLine(position.line);\n }\n\n return this.currentEditor.moveCursor(position);\n }\n\n private moveCursorToLine(/** 0-based line number */ line: number): void {\n const mode = this.currentMode;\n\n switch (mode) {\n case 'markup': {\n const view = this.markupEditor.cm;\n\n let cmLine = line + 1; // lines in codemirror is 1-based\n cmLine = Math.max(cmLine, 1);\n cmLine = Math.min(cmLine, view.state.doc.lines);\n\n const yMargin = getTopOffset(view.dom);\n const anchor = view.state.doc.line(cmLine).from;\n view.dispatch({\n scrollIntoView: true,\n selection: {anchor},\n effects: [\n CMEditorView.scrollIntoView(anchor, {y: 'start', x: 'start', yMargin}),\n ],\n });\n\n break;\n\n // eslint-disable-next-line no-inner-declarations\n }\n case 'wysiwyg': {\n const elem = this.wysiwygEditor.dom.querySelector(`[data-line=\"${line}\"]`);\n\n if (elem) {\n const elemTop = elem.getBoundingClientRect().top;\n const topOffset = getTopOffset(this.wysiwygEditor.dom);\n window.scrollTo({top: elemTop + window.scrollY - topOffset});\n\n const position = this._wysiwygView.posAtDOM(elem, 0);\n const {tr} = this._wysiwygView.state;\n this._wysiwygView.dispatch(\n tr.setSelection(TextSelection.create(tr.doc, position)),\n );\n }\n\n break;\n }\n default:\n throw new Error('Unknown editor mode: ' + mode);\n }\n }\n\n private shouldReplaceMarkupEditorValue(markupValue: string, wysiwygValue: string) {\n const serializedEditorMarkup = this.#wysiwygEditor?.serializer.serialize(\n this.#wysiwygEditor.parser.parse(markupValue),\n this.#escapeConfig,\n );\n return serializedEditorMarkup?.trim() !== wysiwygValue.trim();\n }\n}\n\nfunction getTopOffset(elem: Element) {\n const TOOLBAR_HEIGHT = 36; //px\n const TOOLBAR_BOTTOM_OFFSET = 8; // px\n const TOOLBAR_TOP_ADDITIONAL_OFFSET = 8; // px\n const TOOLBAR_TOP_OFFSET_VAR = '--g-md-toolbar-sticky-offset';\n\n const topOffsetValue = window.getComputedStyle(elem).getPropertyValue(TOOLBAR_TOP_OFFSET_VAR);\n const toolbarTopOffset =\n calculateCSSNumberValue(topOffsetValue) + TOOLBAR_TOP_ADDITIONAL_OFFSET;\n\n return toolbarTopOffset + TOOLBAR_HEIGHT + TOOLBAR_BOTTOM_OFFSET;\n}\n\nfunction calculateCSSNumberValue(cssValue: string): number {\n const tmp = document.createElement('div');\n tmp.style.position = 'absolute';\n tmp.style.top = '-99999px';\n tmp.style.left = '-99999px';\n tmp.style.width = `calc(${cssValue})`;\n\n document.body.appendChild(tmp);\n const value = tmp.getBoundingClientRect().width;\n tmp.remove();\n\n return value;\n}\n"]}
|
|
1
|
+
{"version":3,"file":"Editor.js","sourceRoot":"../../../src","sources":["bundle/Editor.ts"],"names":[],"mappings":"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","sourcesContent":["import type {ReactNode} from 'react';\n\nimport {EditorView as CMEditorView} from '@codemirror/view';\nimport {TextSelection} from 'prosemirror-state';\nimport type {EditorView as PMEditorView} from 'prosemirror-view';\n\nimport type {CommonEditor, MarkupString} from '../common';\nimport {\n type ActionStorage,\n type EscapeConfig,\n WysiwygEditor,\n type WysiwygEditorOptions,\n} from '../core';\nimport type {TransformFn} from '../core/markdown/ProseMirrorTransformer';\nimport type {DynamicModifiers} from '../core/types/dynamicModifiers';\nimport type {ReactRenderStorage, RenderStorage} from '../extensions';\nimport {i18n} from '../i18n/bundle';\nimport {type Logger2, globalLogger} from '../logger';\nimport {createCodemirror} from '../markup';\nimport {getAutocompleteConfig} from '../markup/codemirror/autocomplete';\nimport {type CodeEditor, Editor as MarkupEditor} from '../markup/editor';\nimport {type Emitter, type FileUploadHandler, type Receiver, SafeEventEmitter} from '../utils';\nimport type {DirectiveSyntaxContext} from '../utils/directive';\n\nimport {MarkupManager} from './MarkupManager';\nimport {createDynamicModifiers} from './config/dynamicModifiers';\nimport type {\n MarkdownEditorMode as EditorMode,\n MarkdownEditorPreset as EditorPreset,\n MarkdownEditorMdOptions,\n MarkdownEditorOptions,\n MarkdownEditorMarkupConfig as MarkupConfig,\n ParseInsertedUrlAsImage,\n RenderPreview,\n MarkdownEditorSplitMode as SplitMode,\n} from './types';\n\nexport type ToolbarActionData = {\n editorMode: EditorMode;\n id: string;\n attrs?: {[key: string]: any};\n};\n\nexport interface EventMap {\n change: null;\n cancel: null;\n submit: null;\n\n 'toolbar-action': ToolbarActionData;\n\n 'change-editor-mode': {mode: EditorMode};\n 'change-toolbar-visibility': {visible: boolean};\n 'change-split-mode-enabled': {splitModeEnabled: boolean};\n}\n\n// internal events\ninterface EventMapInt extends EventMap {\n rerender: null;\n 'rerender-toolbar': null;\n 'cm-scroll': {event: Event};\n}\n\nexport interface Editor extends Receiver<EventMap>, CommonEditor {\n readonly logger: Logger2.LogReceiver;\n readonly currentMode: EditorMode;\n readonly toolbarVisible: boolean;\n\n setEditorMode(mode: EditorMode, opts?: SetEditorModeOptions): void;\n\n moveCursor(position: 'start' | 'end' | {line: number}): void;\n\n /** @internal used in demo for dev-tools */\n readonly _wysiwygView?: PMEditorView;\n}\n\n/** @internal */\nexport interface EditorInt\n extends CommonEditor,\n Emitter<EventMapInt>,\n Receiver<EventMapInt>,\n ActionStorage,\n CodeEditor {\n readonly logger: Logger2.ILogger;\n readonly currentMode: EditorMode;\n readonly toolbarVisible: boolean;\n readonly splitModeEnabled: boolean;\n readonly splitMode: SplitMode;\n readonly preset: EditorPreset;\n readonly mdOptions: Readonly<MarkdownEditorMdOptions>;\n readonly directiveSyntax: DirectiveSyntaxContext;\n\n /** @internal used in demo for dev-tools */\n readonly _wysiwygView?: PMEditorView;\n\n readonly currentEditor: CommonEditor;\n readonly wysiwygEditor: WysiwygEditor;\n readonly markupEditor: MarkupEditor;\n\n readonly renderStorage: RenderStorage<ReactNode>;\n readonly fileUploadHandler?: FileUploadHandler;\n readonly needToSetDimensionsForUploadedImages: boolean;\n readonly disableHTMLParsingInMd?: boolean;\n\n readonly renderPreview?: RenderPreview;\n\n changeEditorMode(opts: ChangeEditorModeOptions): void;\n\n setEditorMode(mode: EditorMode, opts?: SetEditorModeOptions): void;\n\n moveCursor(position: 'start' | 'end' | {line: number}): void;\n\n changeToolbarVisibility(opts: {visible: boolean}): void;\n\n changeSplitModeEnabled(opts: {splitModeEnabled: boolean}): void;\n\n destroy(): void;\n}\n\ntype SetEditorModeOptions = Pick<ChangeEditorModeOptions, 'emit'>;\n\nexport type ChangeEditorModeOptions = {\n mode: EditorMode;\n reason: 'error-boundary' | 'settings' | 'manually';\n emit?: boolean;\n};\n\nexport type EditorOptions = Pick<\n MarkdownEditorOptions,\n 'md' | 'initial' | 'handlers' | 'experimental' | 'markupConfig' | 'wysiwygConfig'\n> & {\n logger: Logger2.ILogger;\n renderStorage: ReactRenderStorage;\n preset: EditorPreset;\n directiveSyntax: DirectiveSyntaxContext;\n pmTransformers: TransformFn[];\n};\n\n/** @internal */\nexport class EditorImpl extends SafeEventEmitter<EventMapInt> implements EditorInt {\n #logger: Logger2.ILogger;\n #markup: MarkupString;\n #editorMode: EditorMode;\n #toolbarVisible: boolean;\n #splitModeEnabled: boolean;\n #splitMode: SplitMode;\n #renderPreview?: RenderPreview;\n #wysiwygEditor?: WysiwygEditor;\n #markupEditor?: MarkupEditor;\n #markupConfig: MarkupConfig;\n #escapeConfig?: EscapeConfig;\n #mdOptions: Readonly<MarkdownEditorMdOptions>;\n #pmTransformers: TransformFn[] = [];\n #preserveEmptyRows: boolean;\n #modifiers?: DynamicModifiers[];\n\n readonly #preset: EditorPreset;\n #extensions?: WysiwygEditorOptions['extensions'];\n #renderStorage: ReactRenderStorage;\n #fileUploadHandler?: FileUploadHandler;\n #parseInsertedUrlAsImage?: ParseInsertedUrlAsImage;\n #needToSetDimensionsForUploadedImages: boolean;\n #enableNewImageSizeCalculation: boolean;\n #directiveSyntax: DirectiveSyntaxContext;\n #prepareRawMarkup?: (value: MarkupString) => MarkupString;\n #beforeEditorModeChange?: (\n options: Pick<ChangeEditorModeOptions, 'mode' | 'reason'>,\n ) => boolean | undefined;\n\n get _wysiwygView(): PMEditorView {\n // @ts-expect-error internal typing\n return this.#wysiwygEditor?.view;\n }\n\n get logger(): Logger2.ILogger {\n return this.#logger;\n }\n\n get currentMode(): EditorMode {\n return this.#editorMode;\n }\n\n private set currentMode(newMode: EditorMode) {\n switch (newMode) {\n case 'markup': {\n this.#editorMode = newMode;\n if (this.#wysiwygEditor) {\n const markupEditorValue = this.#markupEditor?.getValue();\n const wysiwygEditorValue = this.#wysiwygEditor.getValue();\n if (\n !markupEditorValue ||\n this.shouldReplaceMarkupEditorValue(markupEditorValue, wysiwygEditorValue)\n ) {\n this.#markup = wysiwygEditorValue;\n } else {\n this.#markup = markupEditorValue;\n }\n }\n if (this.#markupEditor) this.#markupEditor.replace(this.#markup);\n break;\n }\n case 'wysiwyg': {\n this.#editorMode = newMode;\n if (this.#markupEditor) {\n const value = this.#markupEditor.getValue();\n this.#markup = this.#prepareRawMarkup?.(value) ?? value;\n } else if (this.#prepareRawMarkup) {\n this.#markup = this.#prepareRawMarkup(this.#markup);\n }\n if (this.#wysiwygEditor) this.#wysiwygEditor.replace(this.#markup);\n break;\n }\n default:\n throw new Error('Unknown editor mode: ' + newMode);\n }\n setTimeout(() => {\n this.currentEditor.focus();\n }, 30);\n }\n\n get toolbarVisible(): boolean {\n return this.#toolbarVisible;\n }\n\n get splitModeEnabled(): boolean {\n return this.#splitModeEnabled;\n }\n\n get splitMode(): SplitMode {\n return this.#splitMode;\n }\n\n get preset(): EditorPreset {\n return this.#preset;\n }\n\n get mdOptions(): Readonly<MarkdownEditorMdOptions> {\n return this.#mdOptions;\n }\n\n get directiveSyntax(): DirectiveSyntaxContext {\n return this.#directiveSyntax;\n }\n\n get renderPreview(): RenderPreview | undefined {\n return this.#renderPreview;\n }\n\n get currentEditor(): CommonEditor {\n const mode = this.currentMode;\n switch (mode) {\n case 'markup':\n return this.markupEditor;\n case 'wysiwyg':\n return this.wysiwygEditor;\n default:\n throw new Error('Unknown editor mode: ' + mode);\n }\n }\n\n get wysiwygEditor(): WysiwygEditor {\n if (!this.#wysiwygEditor) {\n const mdPreset: NonNullable<WysiwygEditorOptions['mdPreset']> =\n this.#preset === 'zero' || this.#preset === 'commonmark' ? this.#preset : 'default';\n this.#wysiwygEditor = new WysiwygEditor({\n mdPreset,\n logger: this.logger.nested({mode: 'wysiwyg'}),\n initialContent: this.#markup,\n extensions: this.#extensions,\n pmTransformers: this.#pmTransformers,\n modifiers: this.#modifiers,\n allowHTML: this.#mdOptions.html,\n linkify: this.#mdOptions.linkify,\n linkifyTlds: this.#mdOptions.linkifyTlds,\n escapeConfig: this.#escapeConfig,\n onChange: () => this.emit('rerender-toolbar', null),\n onDocChange: () => this.emit('change', null),\n });\n }\n return this.#wysiwygEditor;\n }\n\n get markupEditor(): MarkupEditor {\n if (!this.#markupEditor) {\n this.#markupEditor = new MarkupEditor(\n createCodemirror({\n doc: this.#markup,\n logger: this.logger.nested({mode: 'markup'}),\n placeholder: this.#markupConfig.placeholder ?? i18n('markup_placeholder'),\n onCancel: () => this.emit('cancel', null),\n onSubmit: () => this.emit('submit', null),\n onChange: () => this.emit('rerender-toolbar', null),\n onDocChange: () => this.emit('change', null),\n onScroll: (event) => this.emit('cm-scroll', {event}),\n reactRenderer: this.#renderStorage,\n uploadHandler: this.fileUploadHandler,\n parseInsertedUrlAsImage: this.parseInsertedUrlAsImage,\n needImageDimensions: this.needToSetDimensionsForUploadedImages,\n parseHtmlOnPaste: this.#markupConfig.parseHtmlOnPaste,\n enableNewImageSizeCalculation: this.enableNewImageSizeCalculation,\n extensions: this.#markupConfig.extensions,\n disabledExtensions: this.#markupConfig.disabledExtensions,\n keymaps: this.#markupConfig.keymaps,\n preserveEmptyRows: this.#preserveEmptyRows,\n yfmLangOptions: {\n languageData: getAutocompleteConfig({\n preserveEmptyRows: this.#preserveEmptyRows,\n }).concat(this.#markupConfig?.languageData || []),\n },\n autocompletion: this.#markupConfig.autocompletion,\n directiveSyntax: this.directiveSyntax,\n receiver: this,\n }),\n );\n }\n return this.#markupEditor;\n }\n\n get renderStorage(): RenderStorage<ReactNode> {\n return this.#renderStorage;\n }\n\n get fileUploadHandler(): FileUploadHandler | undefined {\n return this.#fileUploadHandler;\n }\n\n get parseInsertedUrlAsImage() {\n return this.#parseInsertedUrlAsImage;\n }\n\n get needToSetDimensionsForUploadedImages(): boolean {\n return this.#needToSetDimensionsForUploadedImages;\n }\n\n get enableNewImageSizeCalculation(): boolean {\n return this.#enableNewImageSizeCalculation;\n }\n\n constructor(opts: EditorOptions) {\n const {logger} = opts;\n\n super({\n onError: (error) => {\n logger.error(error);\n globalLogger.error(error);\n },\n });\n\n const {\n md = {},\n initial = {},\n handlers = {},\n experimental = {},\n markupConfig = {},\n wysiwygConfig = {},\n } = opts;\n\n this.#logger = logger;\n this.#modifiers = experimental.preserveMarkupFormatting\n ? createDynamicModifiers(\n new MarkupManager(this.logger.nested({module: 'markup-manager'})),\n )\n : undefined;\n\n this.#editorMode = initial.mode ?? 'wysiwyg';\n this.#toolbarVisible = initial.toolbarVisible ?? true;\n this.#splitMode = (markupConfig.renderPreview && markupConfig.splitMode) ?? false;\n this.#splitModeEnabled = (this.#splitMode && initial.splitModeEnabled) ?? false;\n this.#renderPreview = markupConfig.renderPreview;\n\n this.#markup = initial.markup ?? '';\n\n this.#preset = opts.preset ?? 'full';\n this.#pmTransformers = opts.pmTransformers;\n this.#mdOptions = md;\n this.#extensions = wysiwygConfig.extensions;\n this.#markupConfig = {...opts.markupConfig};\n\n this.#renderStorage = opts.renderStorage;\n this.#fileUploadHandler = handlers.uploadFile;\n this.#parseInsertedUrlAsImage = markupConfig.parseInsertedUrlAsImage;\n this.#needToSetDimensionsForUploadedImages = Boolean(\n experimental.needToSetDimensionsForUploadedImages,\n );\n this.#directiveSyntax = opts.directiveSyntax;\n this.#enableNewImageSizeCalculation = Boolean(experimental.enableNewImageSizeCalculation);\n this.#preserveEmptyRows = experimental.preserveEmptyRows || false;\n this.#prepareRawMarkup = experimental.prepareRawMarkup;\n this.#escapeConfig = wysiwygConfig.escapeConfig;\n this.#beforeEditorModeChange = experimental.beforeEditorModeChange;\n }\n\n // ---> implements CodeEditor\n\n get cm() {\n return this.markupEditor.cm;\n }\n\n // <--- implements CodeEditor\n\n // ---> implements ActionStorage\n get actions(): WysiwygEditor.Actions {\n return this.wysiwygEditor.actions;\n }\n\n action<T extends keyof WysiwygEditor.Actions>(actionName: T): WysiwygEditor.Actions[T] {\n return this.wysiwygEditor.action(actionName);\n }\n\n // <--- implements ActionStorage\n\n destroy() {\n this.#wysiwygEditor?.destroy();\n this.#markupEditor?.codemirror.destroy();\n\n this.#markupEditor = undefined;\n this.#markupEditor = undefined;\n this.#wysiwygEditor = undefined;\n }\n\n setEditorMode(mode: EditorMode, opts?: SetEditorModeOptions): void {\n this.changeEditorMode({mode, reason: 'manually', emit: opts?.emit});\n }\n\n changeEditorMode({emit = true, ...opts}: ChangeEditorModeOptions): void {\n if (this.#editorMode === opts.mode) return;\n\n if (this.#beforeEditorModeChange?.({mode: opts.mode, reason: opts.reason}) === false) {\n return;\n }\n\n this.logger.event({\n event: 'mode-change',\n prevMode: this.#editorMode,\n nextMode: opts.mode,\n reason: opts.reason,\n });\n\n this.currentMode = opts.mode;\n this.emit('rerender', null);\n\n if (emit) {\n this.emit('change-editor-mode', opts);\n }\n }\n\n changeToolbarVisibility(opts: {visible: boolean}): void {\n this.#toolbarVisible = opts.visible;\n this.emit('rerender', null);\n this.emit('change-toolbar-visibility', opts);\n }\n\n changeSplitModeEnabled(opts: {splitModeEnabled: boolean}): void {\n if (this.#splitModeEnabled === opts.splitModeEnabled) return;\n this.#splitModeEnabled = opts.splitModeEnabled;\n this.emit('rerender', null);\n this.emit('change-split-mode-enabled', opts);\n }\n\n focus(): void {\n return this.currentEditor.focus();\n }\n\n hasFocus(): boolean {\n return this.currentEditor.hasFocus();\n }\n\n getValue: () => MarkupString = () => this.currentEditor.getValue();\n\n isEmpty(): boolean {\n return this.currentEditor.isEmpty();\n }\n\n clear(): void {\n return this.currentEditor.clear();\n }\n\n replace(newMarkup: MarkupString): void {\n return this.currentEditor.replace(newMarkup);\n }\n\n prepend(markup: MarkupString): void {\n return this.currentEditor.prepend(markup);\n }\n\n append(markup: MarkupString): void {\n return this.currentEditor.append(markup);\n }\n\n moveCursor(\n position:\n | 'start'\n | 'end'\n | {\n /** 0-based line number */\n line: number;\n },\n ): void {\n if (typeof position === 'object') {\n return this.moveCursorToLine(position.line);\n }\n\n return this.currentEditor.moveCursor(position);\n }\n\n private moveCursorToLine(/** 0-based line number */ line: number): void {\n const mode = this.currentMode;\n\n switch (mode) {\n case 'markup': {\n const view = this.markupEditor.cm;\n\n let cmLine = line + 1; // lines in codemirror is 1-based\n cmLine = Math.max(cmLine, 1);\n cmLine = Math.min(cmLine, view.state.doc.lines);\n\n const yMargin = getTopOffset(view.dom);\n const anchor = view.state.doc.line(cmLine).from;\n view.dispatch({\n scrollIntoView: true,\n selection: {anchor},\n effects: [\n CMEditorView.scrollIntoView(anchor, {y: 'start', x: 'start', yMargin}),\n ],\n });\n\n break;\n\n // eslint-disable-next-line no-inner-declarations\n }\n case 'wysiwyg': {\n const elem = this.wysiwygEditor.dom.querySelector(`[data-line=\"${line}\"]`);\n\n if (elem) {\n const elemTop = elem.getBoundingClientRect().top;\n const topOffset = getTopOffset(this.wysiwygEditor.dom);\n window.scrollTo({top: elemTop + window.scrollY - topOffset});\n\n const position = this._wysiwygView.posAtDOM(elem, 0);\n const {tr} = this._wysiwygView.state;\n this._wysiwygView.dispatch(\n tr.setSelection(TextSelection.create(tr.doc, position)),\n );\n }\n\n break;\n }\n default:\n throw new Error('Unknown editor mode: ' + mode);\n }\n }\n\n private shouldReplaceMarkupEditorValue(markupValue: string, wysiwygValue: string) {\n const serializedEditorMarkup = this.#wysiwygEditor?.serializer.serialize(\n this.#wysiwygEditor.parser.parse(markupValue),\n this.#escapeConfig,\n );\n return serializedEditorMarkup?.trim() !== wysiwygValue.trim();\n }\n}\n\nfunction getTopOffset(elem: Element) {\n const TOOLBAR_HEIGHT = 36; //px\n const TOOLBAR_BOTTOM_OFFSET = 8; // px\n const TOOLBAR_TOP_ADDITIONAL_OFFSET = 8; // px\n const TOOLBAR_TOP_OFFSET_VAR = '--g-md-toolbar-sticky-offset';\n\n const topOffsetValue = window.getComputedStyle(elem).getPropertyValue(TOOLBAR_TOP_OFFSET_VAR);\n const toolbarTopOffset =\n calculateCSSNumberValue(topOffsetValue) + TOOLBAR_TOP_ADDITIONAL_OFFSET;\n\n return toolbarTopOffset + TOOLBAR_HEIGHT + TOOLBAR_BOTTOM_OFFSET;\n}\n\nfunction calculateCSSNumberValue(cssValue: string): number {\n const tmp = document.createElement('div');\n tmp.style.position = 'absolute';\n tmp.style.top = '-99999px';\n tmp.style.left = '-99999px';\n tmp.style.width = `calc(${cssValue})`;\n\n document.body.appendChild(tmp);\n const value = tmp.getBoundingClientRect().width;\n tmp.remove();\n\n return value;\n}\n"]}
|
|
@@ -114,7 +114,8 @@ exports.MarkdownEditorView = (0, react_1.forwardRef)((props, ref) => {
|
|
|
114
114
|
]);
|
|
115
115
|
const toaster = (0, uikit_1.useToaster)();
|
|
116
116
|
return ((0, jsx_runtime_1.jsx)(react_error_boundary_1.ErrorBoundary, { onError: (e) => {
|
|
117
|
-
logger_1.
|
|
117
|
+
logger_1.globalLogger.error(e);
|
|
118
|
+
editor.logger.error(e);
|
|
118
119
|
}, fallbackRender: ({ error, resetErrorBoundary }) => {
|
|
119
120
|
toaster.add({
|
|
120
121
|
theme: 'danger',
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"MarkdownEditorView.js","sourceRoot":"../../../src","sources":["bundle/MarkdownEditorView.tsx"],"names":[],"mappings":"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","sourcesContent":["import {\n forwardRef,\n useCallback,\n useEffect,\n useLayoutEffect,\n useMemo,\n useRef,\n useState,\n} from 'react';\n\nimport {useToaster} from '@gravity-ui/uikit';\nimport {ErrorBoundary} from 'react-error-boundary';\nimport {useEnsuredForwardedRef, useKey, useUpdate} from 'react-use';\n\nimport {type ClassNameProps, cn} from '../classname';\nimport {i18n} from '../i18n/bundle';\nimport {logger} from '../logger';\nimport type {ToolbarsPreset} from '../modules/toolbars/types';\nimport {useBooleanState, useSticky} from '../react-utils';\nimport {isMac} from '../utils';\n\nimport type {Editor, EditorInt} from './Editor';\nimport {HorizontalDrag} from './HorizontalDrag';\nimport {MarkupEditorView} from './MarkupEditorView';\nimport {SplitModeView} from './SplitModeView';\nimport {WysiwygEditorView} from './WysiwygEditorView';\nimport {useMarkdownEditorContext} from './context';\nimport {EditorSettings, type EditorSettingsProps} from './settings';\nimport {stickyCn} from './sticky';\nimport type {MToolbarData, MToolbarItemData, WToolbarData, WToolbarItemData} from './toolbar/types';\nimport {getToolbarsConfigs} from './toolbar/utils/toolbarsConfigs';\nimport type {MarkdownEditorMode} from './types';\n\nimport '../styles/styles.scss';\nimport './MarkdownEditorView.scss'; // eslint-disable-line import/order\n\nexport const cnEditorComponent = cn('editor-component');\nconst b = cnEditorComponent;\n\nexport type MarkdownEditorViewProps = ClassNameProps & {\n editor?: Editor;\n autofocus?: boolean;\n toolbarsPreset?: ToolbarsPreset;\n /**\n * @deprecated use `toolbarsPreset` instead\n */\n markupToolbarConfig?: MToolbarData;\n /**\n * @deprecated use `toolbarsPreset` instead\n */\n wysiwygToolbarConfig?: WToolbarData;\n /**\n * @deprecated use `toolbarsPreset` instead\n */\n markupHiddenActionsConfig?: MToolbarItemData[];\n /**\n * @deprecated use `toolbarsPreset` instead\n */\n wysiwygHiddenActionsConfig?: WToolbarItemData[];\n /** @default true */\n settingsVisible?: boolean;\n stickyToolbar: boolean;\n enableSubmitInPreview?: boolean;\n hidePreviewAfterSubmit?: boolean;\n};\n\nexport const MarkdownEditorView = forwardRef<HTMLDivElement, MarkdownEditorViewProps>(\n (props, ref) => {\n const divRef = useEnsuredForwardedRef(ref as React.MutableRefObject<HTMLDivElement>);\n\n const [isMounted, setIsMounted] = useState(false);\n useEffect(() => {\n setIsMounted(true);\n }, []);\n\n const [showPreview, , unsetShowPreview, toggleShowPreview] = useBooleanState(false);\n\n const context = useMarkdownEditorContext();\n const editor = (props.editor ?? context) as EditorInt;\n if (!editor)\n throw new Error(\n '[MarkdownEditorView]: an instance of the editor must be passed through the props or context',\n );\n\n const {\n autofocus,\n className,\n settingsVisible = true,\n toolbarsPreset,\n stickyToolbar,\n wysiwygToolbarConfig: initialWysiwygToolbarConfig,\n markupToolbarConfig: initialMarkupToolbarConfig,\n wysiwygHiddenActionsConfig: initialWysiwygHiddenActionsConfig,\n markupHiddenActionsConfig: initialMarkupHiddenActionsConfig,\n enableSubmitInPreview = true,\n hidePreviewAfterSubmit = false,\n } = props;\n\n const {\n wysiwygToolbarConfig,\n markupToolbarConfig,\n wysiwygHiddenActionsConfig,\n markupHiddenActionsConfig,\n } = useMemo(\n () =>\n getToolbarsConfigs({\n toolbarsPreset,\n props: {\n wysiwygToolbarConfig: initialWysiwygToolbarConfig,\n markupToolbarConfig: initialMarkupToolbarConfig,\n wysiwygHiddenActionsConfig: initialWysiwygHiddenActionsConfig,\n markupHiddenActionsConfig: initialMarkupHiddenActionsConfig,\n },\n preset: editor.preset,\n }),\n [\n toolbarsPreset,\n initialWysiwygToolbarConfig,\n initialMarkupToolbarConfig,\n initialWysiwygHiddenActionsConfig,\n initialMarkupHiddenActionsConfig,\n editor.preset,\n ],\n );\n\n const rerender = useUpdate();\n useLayoutEffect(() => {\n editor.on('rerender', rerender);\n return () => {\n editor.off('rerender', rerender);\n };\n }, [editor, rerender]);\n\n const onModeChange = useCallback(\n (type: MarkdownEditorMode) => {\n editor.changeEditorMode({mode: type, reason: 'settings'});\n unsetShowPreview();\n },\n [editor, unsetShowPreview],\n );\n const onToolbarVisibilityChange = useCallback(\n (visible: boolean) => {\n editor.changeToolbarVisibility({visible});\n },\n [editor],\n );\n const onSplitModeChange = useCallback(\n (splitModeEnabled: boolean) => {\n unsetShowPreview();\n editor.changeSplitModeEnabled({splitModeEnabled});\n },\n [editor, unsetShowPreview],\n );\n\n const onShowPreviewChange = useCallback(\n (showPreviewValue: boolean) => {\n editor.changeSplitModeEnabled({splitModeEnabled: false});\n if (showPreviewValue !== showPreview) toggleShowPreview();\n },\n [editor, showPreview, toggleShowPreview],\n );\n\n const editorMode = editor.currentMode;\n const markupSplitMode =\n editor.splitModeEnabled && editor.splitMode && editorMode === 'markup';\n const canRenderPreview = Boolean(\n editor.renderPreview && editorMode === 'markup' && !editor.splitModeEnabled,\n );\n\n useKey(\n (e) => canRenderPreview && isPreviewKeyDown(e),\n (e) => {\n e.preventDefault();\n onShowPreviewChange(!showPreview);\n },\n {event: 'keydown'},\n [showPreview, editorMode, onShowPreviewChange, canRenderPreview],\n );\n\n const editorWrapperRef = useRef(null);\n const splitModeViewWrapperRef = useRef(null);\n\n useEffect(() => {\n if (showPreview) {\n divRef.current.focus();\n }\n }, [divRef, showPreview]);\n\n useKey(\n (e) =>\n enableSubmitInPreview &&\n showPreview &&\n isWrapperFocused(divRef) &&\n isSubmitKeyDown(e),\n () => {\n editor.emit('submit', null);\n\n if (hidePreviewAfterSubmit) {\n onShowPreviewChange(false);\n }\n },\n {event: 'keydown'},\n [hidePreviewAfterSubmit, enableSubmitInPreview, showPreview, showPreview],\n );\n\n const settings = useMemo(\n () => (\n <Settings\n mode={editorMode}\n settingsVisible={settingsVisible}\n onModeChange={onModeChange}\n toolbarVisibility={editor.toolbarVisible && !showPreview}\n onToolbarVisibilityChange={onToolbarVisibilityChange}\n onSplitModeChange={onSplitModeChange}\n splitModeEnabled={editor.splitModeEnabled}\n splitMode={editor.splitMode}\n stickyToolbar={stickyToolbar}\n onShowPreviewChange={onShowPreviewChange}\n showPreview={showPreview}\n renderPreviewButton={canRenderPreview}\n />\n ),\n [\n editorMode,\n settingsVisible,\n editor.toolbarVisible,\n editor.splitModeEnabled,\n editor.splitMode,\n onModeChange,\n showPreview,\n onToolbarVisibilityChange,\n onSplitModeChange,\n stickyToolbar,\n onShowPreviewChange,\n canRenderPreview,\n ],\n );\n\n const toaster = useToaster();\n\n return (\n <ErrorBoundary\n onError={(e) => {\n logger.error(e);\n }}\n fallbackRender={({error, resetErrorBoundary}) => {\n toaster.add({\n theme: 'danger',\n name: 'g-md-editor-error',\n title: i18n('error-title'),\n content: error.message,\n });\n setTimeout(() => {\n resetErrorBoundary();\n editor.changeEditorMode({\n mode: 'markup',\n reason: 'error-boundary',\n emit: false,\n });\n });\n return null;\n }}\n >\n <div\n ref={divRef}\n className={b(\n {\n settings: settingsVisible,\n split: markupSplitMode && editor.splitMode,\n },\n [className],\n )}\n role=\"button\"\n tabIndex={0}\n >\n <div className={b('editor-wrapper')} ref={editorWrapperRef}>\n {showPreview ? (\n <>\n <div className={b('preview-wrapper')}>\n {editor.renderPreview?.({\n getValue: editor.getValue,\n mode: 'preview',\n md: editor.mdOptions,\n directiveSyntax: editor.directiveSyntax,\n })}\n </div>\n {settings}\n </>\n ) : (\n <>\n {editorMode === 'wysiwyg' && (\n <WysiwygEditorView\n editor={editor}\n autofocus={autofocus}\n settingsVisible={settingsVisible}\n toolbarConfig={wysiwygToolbarConfig}\n toolbarVisible={editor.toolbarVisible}\n hiddenActionsConfig={wysiwygHiddenActionsConfig}\n className={b('editor', {mode: editorMode})}\n toolbarClassName={b('toolbar')}\n stickyToolbar={stickyToolbar}\n >\n {editor.toolbarVisible && settingsVisible && settings}\n </WysiwygEditorView>\n )}\n {editorMode === 'markup' && (\n <MarkupEditorView\n editor={editor}\n autofocus={autofocus}\n settingsVisible={settingsVisible}\n toolbarConfig={markupToolbarConfig}\n toolbarVisible={editor.toolbarVisible}\n splitMode={editor.splitMode}\n splitModeEnabled={editor.splitModeEnabled}\n hiddenActionsConfig={markupHiddenActionsConfig}\n className={b('editor', {mode: editorMode})}\n toolbarClassName={b('toolbar')}\n stickyToolbar={stickyToolbar}\n >\n {editor.toolbarVisible && settings}\n </MarkupEditorView>\n )}\n {!editor.toolbarVisible && settings}\n </>\n )}\n </div>\n\n {markupSplitMode && (\n <>\n {editor.splitMode === 'horizontal' ? (\n <HorizontalDrag\n editor={editor}\n isMounted={isMounted}\n leftElRef={editorWrapperRef}\n rightElRef={splitModeViewWrapperRef}\n wrapperRef={divRef}\n />\n ) : (\n <div className={b('resizer')} />\n )}\n <SplitModeView editor={editor} ref={splitModeViewWrapperRef} />\n </>\n )}\n </div>\n </ErrorBoundary>\n );\n },\n);\nMarkdownEditorView.displayName = 'MarkdownEditorView';\n\ninterface MarkupSearchAnchorProps extends Pick<EditorSettingsProps, 'mode'> {}\n\nconst MarkupSearchAnchor: React.FC<MarkupSearchAnchorProps> = ({mode}) => (\n <>{mode === 'markup' && <div className=\"g-md-search-anchor\"></div>}</>\n);\n\nfunction Settings(props: EditorSettingsProps & {stickyToolbar: boolean}) {\n const wrapperRef = useRef<HTMLDivElement>(null);\n const isSticky = useSticky(wrapperRef) && props.toolbarVisibility && props.stickyToolbar;\n\n return (\n <>\n {(props.renderPreviewButton || props.settingsVisible) && (\n <div className={b('settings-wrapper')}>\n <div\n ref={wrapperRef}\n className={stickyCn.settings({\n withToolbar: props.toolbarVisibility,\n stickyActive: isSticky,\n })}\n >\n <EditorSettings {...props} />\n <MarkupSearchAnchor {...props} />\n </div>\n </div>\n )}\n </>\n );\n}\n\nfunction isPreviewKeyDown(e: KeyboardEvent) {\n const modKey = isMac() ? e.metaKey : e.ctrlKey;\n return modKey && e.shiftKey && e.code === 'KeyP';\n}\n\nfunction isWrapperFocused(divRef: React.RefObject<HTMLDivElement>) {\n return document.activeElement === divRef.current;\n}\n\nfunction isSubmitKeyDown(e: KeyboardEvent) {\n const modKey = isMac() ? e.metaKey : e.ctrlKey;\n return modKey && e.code === 'Enter';\n}\n"]}
|
|
1
|
+
{"version":3,"file":"MarkdownEditorView.js","sourceRoot":"../../../src","sources":["bundle/MarkdownEditorView.tsx"],"names":[],"mappings":"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","sourcesContent":["import {\n forwardRef,\n useCallback,\n useEffect,\n useLayoutEffect,\n useMemo,\n useRef,\n useState,\n} from 'react';\n\nimport {useToaster} from '@gravity-ui/uikit';\nimport {ErrorBoundary} from 'react-error-boundary';\nimport {useEnsuredForwardedRef, useKey, useUpdate} from 'react-use';\n\nimport {type ClassNameProps, cn} from '../classname';\nimport {i18n} from '../i18n/bundle';\nimport {globalLogger} from '../logger';\nimport type {ToolbarsPreset} from '../modules/toolbars/types';\nimport {useBooleanState, useSticky} from '../react-utils';\nimport {isMac} from '../utils';\n\nimport type {Editor, EditorInt} from './Editor';\nimport {HorizontalDrag} from './HorizontalDrag';\nimport {MarkupEditorView} from './MarkupEditorView';\nimport {SplitModeView} from './SplitModeView';\nimport {WysiwygEditorView} from './WysiwygEditorView';\nimport {useMarkdownEditorContext} from './context';\nimport {EditorSettings, type EditorSettingsProps} from './settings';\nimport {stickyCn} from './sticky';\nimport type {MToolbarData, MToolbarItemData, WToolbarData, WToolbarItemData} from './toolbar/types';\nimport {getToolbarsConfigs} from './toolbar/utils/toolbarsConfigs';\nimport type {MarkdownEditorMode} from './types';\n\nimport '../styles/styles.scss';\nimport './MarkdownEditorView.scss'; // eslint-disable-line import/order\n\nexport const cnEditorComponent = cn('editor-component');\nconst b = cnEditorComponent;\n\nexport type MarkdownEditorViewProps = ClassNameProps & {\n editor?: Editor;\n autofocus?: boolean;\n toolbarsPreset?: ToolbarsPreset;\n /**\n * @deprecated use `toolbarsPreset` instead\n */\n markupToolbarConfig?: MToolbarData;\n /**\n * @deprecated use `toolbarsPreset` instead\n */\n wysiwygToolbarConfig?: WToolbarData;\n /**\n * @deprecated use `toolbarsPreset` instead\n */\n markupHiddenActionsConfig?: MToolbarItemData[];\n /**\n * @deprecated use `toolbarsPreset` instead\n */\n wysiwygHiddenActionsConfig?: WToolbarItemData[];\n /** @default true */\n settingsVisible?: boolean;\n stickyToolbar: boolean;\n enableSubmitInPreview?: boolean;\n hidePreviewAfterSubmit?: boolean;\n};\n\nexport const MarkdownEditorView = forwardRef<HTMLDivElement, MarkdownEditorViewProps>(\n (props, ref) => {\n const divRef = useEnsuredForwardedRef(ref as React.MutableRefObject<HTMLDivElement>);\n\n const [isMounted, setIsMounted] = useState(false);\n useEffect(() => {\n setIsMounted(true);\n }, []);\n\n const [showPreview, , unsetShowPreview, toggleShowPreview] = useBooleanState(false);\n\n const context = useMarkdownEditorContext();\n const editor = (props.editor ?? context) as EditorInt;\n if (!editor)\n throw new Error(\n '[MarkdownEditorView]: an instance of the editor must be passed through the props or context',\n );\n\n const {\n autofocus,\n className,\n settingsVisible = true,\n toolbarsPreset,\n stickyToolbar,\n wysiwygToolbarConfig: initialWysiwygToolbarConfig,\n markupToolbarConfig: initialMarkupToolbarConfig,\n wysiwygHiddenActionsConfig: initialWysiwygHiddenActionsConfig,\n markupHiddenActionsConfig: initialMarkupHiddenActionsConfig,\n enableSubmitInPreview = true,\n hidePreviewAfterSubmit = false,\n } = props;\n\n const {\n wysiwygToolbarConfig,\n markupToolbarConfig,\n wysiwygHiddenActionsConfig,\n markupHiddenActionsConfig,\n } = useMemo(\n () =>\n getToolbarsConfigs({\n toolbarsPreset,\n props: {\n wysiwygToolbarConfig: initialWysiwygToolbarConfig,\n markupToolbarConfig: initialMarkupToolbarConfig,\n wysiwygHiddenActionsConfig: initialWysiwygHiddenActionsConfig,\n markupHiddenActionsConfig: initialMarkupHiddenActionsConfig,\n },\n preset: editor.preset,\n }),\n [\n toolbarsPreset,\n initialWysiwygToolbarConfig,\n initialMarkupToolbarConfig,\n initialWysiwygHiddenActionsConfig,\n initialMarkupHiddenActionsConfig,\n editor.preset,\n ],\n );\n\n const rerender = useUpdate();\n useLayoutEffect(() => {\n editor.on('rerender', rerender);\n return () => {\n editor.off('rerender', rerender);\n };\n }, [editor, rerender]);\n\n const onModeChange = useCallback(\n (type: MarkdownEditorMode) => {\n editor.changeEditorMode({mode: type, reason: 'settings'});\n unsetShowPreview();\n },\n [editor, unsetShowPreview],\n );\n const onToolbarVisibilityChange = useCallback(\n (visible: boolean) => {\n editor.changeToolbarVisibility({visible});\n },\n [editor],\n );\n const onSplitModeChange = useCallback(\n (splitModeEnabled: boolean) => {\n unsetShowPreview();\n editor.changeSplitModeEnabled({splitModeEnabled});\n },\n [editor, unsetShowPreview],\n );\n\n const onShowPreviewChange = useCallback(\n (showPreviewValue: boolean) => {\n editor.changeSplitModeEnabled({splitModeEnabled: false});\n if (showPreviewValue !== showPreview) toggleShowPreview();\n },\n [editor, showPreview, toggleShowPreview],\n );\n\n const editorMode = editor.currentMode;\n const markupSplitMode =\n editor.splitModeEnabled && editor.splitMode && editorMode === 'markup';\n const canRenderPreview = Boolean(\n editor.renderPreview && editorMode === 'markup' && !editor.splitModeEnabled,\n );\n\n useKey(\n (e) => canRenderPreview && isPreviewKeyDown(e),\n (e) => {\n e.preventDefault();\n onShowPreviewChange(!showPreview);\n },\n {event: 'keydown'},\n [showPreview, editorMode, onShowPreviewChange, canRenderPreview],\n );\n\n const editorWrapperRef = useRef(null);\n const splitModeViewWrapperRef = useRef(null);\n\n useEffect(() => {\n if (showPreview) {\n divRef.current.focus();\n }\n }, [divRef, showPreview]);\n\n useKey(\n (e) =>\n enableSubmitInPreview &&\n showPreview &&\n isWrapperFocused(divRef) &&\n isSubmitKeyDown(e),\n () => {\n editor.emit('submit', null);\n\n if (hidePreviewAfterSubmit) {\n onShowPreviewChange(false);\n }\n },\n {event: 'keydown'},\n [hidePreviewAfterSubmit, enableSubmitInPreview, showPreview, showPreview],\n );\n\n const settings = useMemo(\n () => (\n <Settings\n mode={editorMode}\n settingsVisible={settingsVisible}\n onModeChange={onModeChange}\n toolbarVisibility={editor.toolbarVisible && !showPreview}\n onToolbarVisibilityChange={onToolbarVisibilityChange}\n onSplitModeChange={onSplitModeChange}\n splitModeEnabled={editor.splitModeEnabled}\n splitMode={editor.splitMode}\n stickyToolbar={stickyToolbar}\n onShowPreviewChange={onShowPreviewChange}\n showPreview={showPreview}\n renderPreviewButton={canRenderPreview}\n />\n ),\n [\n editorMode,\n settingsVisible,\n editor.toolbarVisible,\n editor.splitModeEnabled,\n editor.splitMode,\n onModeChange,\n showPreview,\n onToolbarVisibilityChange,\n onSplitModeChange,\n stickyToolbar,\n onShowPreviewChange,\n canRenderPreview,\n ],\n );\n\n const toaster = useToaster();\n\n return (\n <ErrorBoundary\n onError={(e) => {\n globalLogger.error(e);\n editor.logger.error(e);\n }}\n fallbackRender={({error, resetErrorBoundary}) => {\n toaster.add({\n theme: 'danger',\n name: 'g-md-editor-error',\n title: i18n('error-title'),\n content: error.message,\n });\n setTimeout(() => {\n resetErrorBoundary();\n editor.changeEditorMode({\n mode: 'markup',\n reason: 'error-boundary',\n emit: false,\n });\n });\n return null;\n }}\n >\n <div\n ref={divRef}\n className={b(\n {\n settings: settingsVisible,\n split: markupSplitMode && editor.splitMode,\n },\n [className],\n )}\n role=\"button\"\n tabIndex={0}\n >\n <div className={b('editor-wrapper')} ref={editorWrapperRef}>\n {showPreview ? (\n <>\n <div className={b('preview-wrapper')}>\n {editor.renderPreview?.({\n getValue: editor.getValue,\n mode: 'preview',\n md: editor.mdOptions,\n directiveSyntax: editor.directiveSyntax,\n })}\n </div>\n {settings}\n </>\n ) : (\n <>\n {editorMode === 'wysiwyg' && (\n <WysiwygEditorView\n editor={editor}\n autofocus={autofocus}\n settingsVisible={settingsVisible}\n toolbarConfig={wysiwygToolbarConfig}\n toolbarVisible={editor.toolbarVisible}\n hiddenActionsConfig={wysiwygHiddenActionsConfig}\n className={b('editor', {mode: editorMode})}\n toolbarClassName={b('toolbar')}\n stickyToolbar={stickyToolbar}\n >\n {editor.toolbarVisible && settingsVisible && settings}\n </WysiwygEditorView>\n )}\n {editorMode === 'markup' && (\n <MarkupEditorView\n editor={editor}\n autofocus={autofocus}\n settingsVisible={settingsVisible}\n toolbarConfig={markupToolbarConfig}\n toolbarVisible={editor.toolbarVisible}\n splitMode={editor.splitMode}\n splitModeEnabled={editor.splitModeEnabled}\n hiddenActionsConfig={markupHiddenActionsConfig}\n className={b('editor', {mode: editorMode})}\n toolbarClassName={b('toolbar')}\n stickyToolbar={stickyToolbar}\n >\n {editor.toolbarVisible && settings}\n </MarkupEditorView>\n )}\n {!editor.toolbarVisible && settings}\n </>\n )}\n </div>\n\n {markupSplitMode && (\n <>\n {editor.splitMode === 'horizontal' ? (\n <HorizontalDrag\n editor={editor}\n isMounted={isMounted}\n leftElRef={editorWrapperRef}\n rightElRef={splitModeViewWrapperRef}\n wrapperRef={divRef}\n />\n ) : (\n <div className={b('resizer')} />\n )}\n <SplitModeView editor={editor} ref={splitModeViewWrapperRef} />\n </>\n )}\n </div>\n </ErrorBoundary>\n );\n },\n);\nMarkdownEditorView.displayName = 'MarkdownEditorView';\n\ninterface MarkupSearchAnchorProps extends Pick<EditorSettingsProps, 'mode'> {}\n\nconst MarkupSearchAnchor: React.FC<MarkupSearchAnchorProps> = ({mode}) => (\n <>{mode === 'markup' && <div className=\"g-md-search-anchor\"></div>}</>\n);\n\nfunction Settings(props: EditorSettingsProps & {stickyToolbar: boolean}) {\n const wrapperRef = useRef<HTMLDivElement>(null);\n const isSticky = useSticky(wrapperRef) && props.toolbarVisibility && props.stickyToolbar;\n\n return (\n <>\n {(props.renderPreviewButton || props.settingsVisible) && (\n <div className={b('settings-wrapper')}>\n <div\n ref={wrapperRef}\n className={stickyCn.settings({\n withToolbar: props.toolbarVisibility,\n stickyActive: isSticky,\n })}\n >\n <EditorSettings {...props} />\n <MarkupSearchAnchor {...props} />\n </div>\n </div>\n )}\n </>\n );\n}\n\nfunction isPreviewKeyDown(e: KeyboardEvent) {\n const modKey = isMac() ? e.metaKey : e.ctrlKey;\n return modKey && e.shiftKey && e.code === 'KeyP';\n}\n\nfunction isWrapperFocused(divRef: React.RefObject<HTMLDivElement>) {\n return document.activeElement === divRef.current;\n}\n\nfunction isSubmitKeyDown(e: KeyboardEvent) {\n const modKey = isMac() ? e.metaKey : e.ctrlKey;\n return modKey && e.code === 'Enter';\n}\n"]}
|
|
@@ -15,7 +15,12 @@ const b = (0, classname_1.cn)('markup-editor');
|
|
|
15
15
|
exports.MarkupEditorView = (0, react_1.memo)((props) => {
|
|
16
16
|
const { editor, autofocus, settingsVisible, toolbarVisible, toolbarConfig, hiddenActionsConfig, className, toolbarClassName, children, stickyToolbar = true, } = props;
|
|
17
17
|
(0, hooks_1.useRenderTime)((time) => {
|
|
18
|
-
logger_1.
|
|
18
|
+
logger_1.globalLogger.metrics({
|
|
19
|
+
component: 'markup-editor',
|
|
20
|
+
event: 'render',
|
|
21
|
+
duration: time,
|
|
22
|
+
});
|
|
23
|
+
editor.logger.metrics({
|
|
19
24
|
component: 'markup-editor',
|
|
20
25
|
event: 'render',
|
|
21
26
|
duration: time,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"MarkupEditorView.js","sourceRoot":"../../../src","sources":["bundle/MarkupEditorView.tsx"],"names":[],"mappings":";;;;AAAA,iCAA2B;AAE3B,+CAAqD;AACrD,uDAAqD;AACrD,
|
|
1
|
+
{"version":3,"file":"MarkupEditorView.js","sourceRoot":"../../../src","sources":["bundle/MarkupEditorView.tsx"],"names":[],"mappings":";;;;AAAA,iCAA2B;AAE3B,+CAAqD;AACrD,uDAAqD;AACrD,yCAAuC;AACvC,mDAAmD;AAGnD,sEAA8D;AAC9D,kDAA0C;AAC1C,yDAAsE;AAItE,kCAAiC;AAEjC,MAAM,CAAC,GAAG,IAAA,cAAE,EAAC,eAAe,CAAC,CAAC;AAgBjB,QAAA,gBAAgB,GAAG,IAAA,YAAI,EAAwB,CAAC,KAAK,EAAE,EAAE;IAClE,MAAM,EACF,MAAM,EACN,SAAS,EACT,eAAe,EACf,cAAc,EACd,aAAa,EACb,mBAAmB,EACnB,SAAS,EACT,gBAAgB,EAChB,QAAQ,EACR,aAAa,GAAG,IAAI,GACvB,GAAG,KAAK,CAAC;IACV,IAAA,qBAAa,EAAC,CAAC,IAAI,EAAE,EAAE;QACnB,qBAAY,CAAC,OAAO,CAAC;YACjB,SAAS,EAAE,eAAe;YAC1B,KAAK,EAAE,QAAQ;YACf,QAAQ,EAAE,IAAI;SACjB,CAAC,CAAC;QACH,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC;YAClB,SAAS,EAAE,eAAe;YAC1B,KAAK,EAAE,QAAQ;YACf,QAAQ,EAAE,IAAI;SACjB,CAAC,CAAC;IACP,CAAC,CAAC,CAAC;IAEH,OAAO,CACH,iCAAK,SAAS,EAAE,CAAC,CAAC,EAAC,OAAO,EAAE,cAAc,EAAC,EAAE,CAAC,SAAS,CAAC,CAAC,aACpD,cAAc,CAAC,CAAC,CAAC,CACd,uBAAC,sCAA4B,IACzB,KAAK,EAAE;oBACH,aAAa,EAAE,MAAM,CAAC,iBAAiB;oBACvC,oCAAoC,EAChC,MAAM,CAAC,oCAAoC;iBAClD,YAED,uBAAC,yBAAW,IACR,MAAM,EAAE,MAAM,EACd,UAAU,EAAC,QAAQ,EACnB,aAAa,EAAE,MAAM,EACrB,mBAAmB,EAAE,mBAAmB,EACxC,aAAa,EAAE,aAAa,EAC5B,aAAa,EAAE,aAAa,EAC5B,YAAY,EAAE,GAAG,EAAE,CAAC,MAAM,CAAC,KAAK,EAAE,EAClC,eAAe,EAAE,eAAe,EAChC,SAAS,EAAE,CAAC,CAAC,SAAS,EAAE,CAAC,gBAAgB,CAAC,CAAC,YAE1C,QAAQ,GACC,GACa,CAClC,CAAC,CAAC,CAAC,IAAI,EACR,uBAAC,6CAAqB,IAClB,SAAS,EAAE,SAAS,EACpB,MAAM,EAAE,MAAM,EACd,SAAS,EAAE,CAAC,CAAC,QAAQ,EAAE,EAAC,iBAAiB,EAAE,cAAc,EAAC,CAAC,YAE3D,uBAAC,mCAAsB,IAAC,OAAO,EAAE,MAAM,CAAC,aAAa,GAAI,GACrC,IACtB,CACT,CAAC;AACN,CAAC,CAAC,CAAC;AACH,wBAAgB,CAAC,WAAW,GAAG,0BAA0B,CAAC","sourcesContent":["import {memo} from 'react';\n\nimport {type ClassNameProps, cn} from '../classname';\nimport {ReactRendererComponent} from '../extensions';\nimport {globalLogger} from '../logger';\nimport {useRenderTime} from '../react-utils/hooks';\n\nimport type {EditorInt} from './Editor';\nimport {MarkupEditorComponent} from './MarkupEditorComponent';\nimport {ToolbarView} from './ToolbarView';\nimport {MarkupToolbarContextProvider} from './toolbar/markup/context';\nimport type {MToolbarData, MToolbarItemData} from './toolbar/types';\nimport type {MarkdownEditorSplitMode} from './types';\n\nimport './MarkupEditorView.scss';\n\nconst b = cn('markup-editor');\n\nexport type MarkupEditorViewProps = ClassNameProps & {\n editor: EditorInt;\n autofocus?: boolean;\n toolbarConfig: MToolbarData;\n settingsVisible?: boolean;\n toolbarVisible?: boolean;\n stickyToolbar?: boolean;\n toolbarClassName?: string;\n splitMode?: MarkdownEditorSplitMode;\n splitModeEnabled: boolean;\n hiddenActionsConfig?: MToolbarItemData[];\n children?: React.ReactNode;\n};\n\nexport const MarkupEditorView = memo<MarkupEditorViewProps>((props) => {\n const {\n editor,\n autofocus,\n settingsVisible,\n toolbarVisible,\n toolbarConfig,\n hiddenActionsConfig,\n className,\n toolbarClassName,\n children,\n stickyToolbar = true,\n } = props;\n useRenderTime((time) => {\n globalLogger.metrics({\n component: 'markup-editor',\n event: 'render',\n duration: time,\n });\n editor.logger.metrics({\n component: 'markup-editor',\n event: 'render',\n duration: time,\n });\n });\n\n return (\n <div className={b({toolbar: toolbarVisible}, [className])}>\n {toolbarVisible ? (\n <MarkupToolbarContextProvider\n value={{\n uploadHandler: editor.fileUploadHandler,\n needToSetDimensionsForUploadedImages:\n editor.needToSetDimensionsForUploadedImages,\n }}\n >\n <ToolbarView\n editor={editor}\n editorMode=\"markup\"\n toolbarEditor={editor}\n hiddenActionsConfig={hiddenActionsConfig}\n stickyToolbar={stickyToolbar}\n toolbarConfig={toolbarConfig}\n toolbarFocus={() => editor.focus()}\n settingsVisible={settingsVisible}\n className={b('toolbar', [toolbarClassName])}\n >\n {children}\n </ToolbarView>\n </MarkupToolbarContextProvider>\n ) : null}\n <MarkupEditorComponent\n autofocus={autofocus}\n editor={editor}\n className={b('editor', {'toolbar-visible': toolbarVisible})}\n >\n <ReactRendererComponent storage={editor.renderStorage} />\n </MarkupEditorComponent>\n </div>\n );\n});\nMarkupEditorView.displayName = 'MarkdownMarkupEditorView';\n"]}
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import type { Node } from 'prosemirror-model';
|
|
2
|
+
import type { Logger2 } from "../logger.js";
|
|
2
3
|
import { SafeEventEmitter } from "../utils/index.js";
|
|
3
4
|
export interface IMarkupManager {
|
|
4
5
|
setMarkup(id: string, rawMarkup: string): void;
|
|
@@ -8,10 +9,6 @@ export interface IMarkupManager {
|
|
|
8
9
|
reset(): void;
|
|
9
10
|
on<K extends keyof Events>(event: K, listener: (value: Events[K]) => void): void;
|
|
10
11
|
}
|
|
11
|
-
export interface Logger {
|
|
12
|
-
log(message: string): void;
|
|
13
|
-
error(message: string): void;
|
|
14
|
-
}
|
|
15
12
|
interface Events {
|
|
16
13
|
markupChanged: {
|
|
17
14
|
id: string;
|
|
@@ -27,8 +24,8 @@ export declare class MarkupManager extends SafeEventEmitter<Events> implements I
|
|
|
27
24
|
private _markups;
|
|
28
25
|
private _nodes;
|
|
29
26
|
private _namespace;
|
|
30
|
-
private readonly logger
|
|
31
|
-
constructor(logger
|
|
27
|
+
private readonly logger;
|
|
28
|
+
constructor(logger: Logger2.ILogger);
|
|
32
29
|
/**
|
|
33
30
|
* Set raw markup for a specific id
|
|
34
31
|
*/
|
|
@@ -18,24 +18,24 @@ class MarkupManager extends utils_1.SafeEventEmitter {
|
|
|
18
18
|
*/
|
|
19
19
|
setMarkup(id, rawMarkup) {
|
|
20
20
|
if (typeof rawMarkup !== 'string') {
|
|
21
|
-
this.logger
|
|
21
|
+
this.logger.warn('[MarkupManager] rawMarkup must be a string');
|
|
22
22
|
return;
|
|
23
23
|
}
|
|
24
24
|
this._markups.set(id, rawMarkup);
|
|
25
25
|
this.emit('markupChanged', { id, rawMarkup });
|
|
26
|
-
this.logger
|
|
26
|
+
this.logger.log(`[MarkupManager] Raw markup for ID ${id} set successfully`);
|
|
27
27
|
}
|
|
28
28
|
/**
|
|
29
29
|
* Set a node for a specific id
|
|
30
30
|
*/
|
|
31
31
|
setNode(id, node) {
|
|
32
32
|
if (!node) {
|
|
33
|
-
this.logger
|
|
33
|
+
this.logger.warn('[MarkupManager] Node must be a valid ProseMirror Node');
|
|
34
34
|
return;
|
|
35
35
|
}
|
|
36
36
|
this._nodes.set(id, node);
|
|
37
37
|
this.emit('nodeChanged', { id, node });
|
|
38
|
-
this.logger
|
|
38
|
+
this.logger.log(`[MarkupManager] Node for ID ${id} set successfully`);
|
|
39
39
|
}
|
|
40
40
|
/**
|
|
41
41
|
* Get raw markup for a specific id
|
|
@@ -59,7 +59,7 @@ class MarkupManager extends utils_1.SafeEventEmitter {
|
|
|
59
59
|
this._markups.clear();
|
|
60
60
|
this._nodes.clear();
|
|
61
61
|
this.emit('reset', {});
|
|
62
|
-
this.logger
|
|
62
|
+
this.logger.log('[MarkupManager] MarkupManager has been reset');
|
|
63
63
|
}
|
|
64
64
|
}
|
|
65
65
|
exports.MarkupManager = MarkupManager;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"MarkupManager.js","sourceRoot":"../../../src","sources":["bundle/MarkupManager.ts"],"names":[],"mappings":";;;AACA,+BAAwB;
|
|
1
|
+
{"version":3,"file":"MarkupManager.js","sourceRoot":"../../../src","sources":["bundle/MarkupManager.ts"],"names":[],"mappings":";;;AACA,+BAAwB;AAGxB,6CAA0C;AAiB1C,MAAa,aAAc,SAAQ,wBAAwB;IAC/C,QAAQ,GAAwB,IAAI,GAAG,EAAE,CAAC;IAC1C,MAAM,GAAsB,IAAI,GAAG,EAAE,CAAC;IACtC,UAAU,CAAS;IAEV,MAAM,CAAkB;IAEzC,YAAY,MAAuB;QAC/B,KAAK,EAAE,CAAC;QACR,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC;QACrB,IAAI,CAAC,UAAU,GAAG,IAAA,SAAE,GAAE,CAAC;IAC3B,CAAC;IAED;;OAEG;IACH,SAAS,CAAC,EAAU,EAAE,SAAiB;QACnC,IAAI,OAAO,SAAS,KAAK,QAAQ,EAAE,CAAC;YAChC,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,4CAA4C,CAAC,CAAC;YAC/D,OAAO;QACX,CAAC;QACD,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE,EAAE,SAAS,CAAC,CAAC;QAEjC,IAAI,CAAC,IAAI,CAAC,eAAe,EAAE,EAAC,EAAE,EAAE,SAAS,EAAC,CAAC,CAAC;QAC5C,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,qCAAqC,EAAE,mBAAmB,CAAC,CAAC;IAChF,CAAC;IAED;;OAEG;IACH,OAAO,CAAC,EAAU,EAAE,IAAU;QAC1B,IAAI,CAAC,IAAI,EAAE,CAAC;YACR,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,uDAAuD,CAAC,CAAC;YAC1E,OAAO;QACX,CAAC;QACD,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,EAAE,IAAI,CAAC,CAAC;QAE1B,IAAI,CAAC,IAAI,CAAC,aAAa,EAAE,EAAC,EAAE,EAAE,IAAI,EAAC,CAAC,CAAC;QACrC,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,+BAA+B,EAAE,mBAAmB,CAAC,CAAC;IAC1E,CAAC;IAED;;OAEG;IACH,SAAS,CAAC,EAAU;QAChB,OAAO,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE,CAAC,IAAI,IAAI,CAAC;IACzC,CAAC;IAED;;OAEG;IACH,OAAO,CAAC,EAAU;QACd,OAAO,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC,IAAI,IAAI,CAAC;IACvC,CAAC;IAED,YAAY;QACR,OAAO,IAAI,CAAC,UAAU,CAAC;IAC3B,CAAC;IAED;;OAEG;IACH,KAAK;QACD,IAAI,CAAC,QAAQ,CAAC,KAAK,EAAE,CAAC;QACtB,IAAI,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC;QAEpB,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC;QACvB,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,8CAA8C,CAAC,CAAC;IACpE,CAAC;CACJ;AArED,sCAqEC","sourcesContent":["import type {Node} from 'prosemirror-model';\nimport {v4} from 'uuid';\n\nimport type {Logger2} from '../logger';\nimport {SafeEventEmitter} from '../utils';\n\nexport interface IMarkupManager {\n setMarkup(id: string, rawMarkup: string): void;\n setNode(id: string, node: Node): void;\n getMarkup(id: string): string | null;\n getNode(id: string): Node | null;\n reset(): void;\n on<K extends keyof Events>(event: K, listener: (value: Events[K]) => void): void;\n}\n\ninterface Events {\n markupChanged: {id: string; rawMarkup: string};\n nodeChanged: {id: string; node: Node};\n reset: {};\n}\n\nexport class MarkupManager extends SafeEventEmitter<Events> implements IMarkupManager {\n private _markups: Map<string, string> = new Map();\n private _nodes: Map<string, Node> = new Map();\n private _namespace: string;\n\n private readonly logger: Logger2.ILogger;\n\n constructor(logger: Logger2.ILogger) {\n super();\n this.logger = logger;\n this._namespace = v4();\n }\n\n /**\n * Set raw markup for a specific id\n */\n setMarkup(id: string, rawMarkup: string): void {\n if (typeof rawMarkup !== 'string') {\n this.logger.warn('[MarkupManager] rawMarkup must be a string');\n return;\n }\n this._markups.set(id, rawMarkup);\n\n this.emit('markupChanged', {id, rawMarkup});\n this.logger.log(`[MarkupManager] Raw markup for ID ${id} set successfully`);\n }\n\n /**\n * Set a node for a specific id\n */\n setNode(id: string, node: Node): void {\n if (!node) {\n this.logger.warn('[MarkupManager] Node must be a valid ProseMirror Node');\n return;\n }\n this._nodes.set(id, node);\n\n this.emit('nodeChanged', {id, node});\n this.logger.log(`[MarkupManager] Node for ID ${id} set successfully`);\n }\n\n /**\n * Get raw markup for a specific id\n */\n getMarkup(id: string): string | null {\n return this._markups.get(id) ?? null;\n }\n\n /**\n * Get a node for a specific id\n */\n getNode(id: string): Node | null {\n return this._nodes.get(id) ?? null;\n }\n\n getNamespace(): string {\n return this._namespace;\n }\n\n /**\n * Reset the stored markups and nodes\n */\n reset(): void {\n this._markups.clear();\n this._nodes.clear();\n\n this.emit('reset', {});\n this.logger.log('[MarkupManager] MarkupManager has been reset');\n }\n}\n"]}
|
|
@@ -14,7 +14,12 @@ const b = (0, classname_1.cn)('wysiwyg-editor');
|
|
|
14
14
|
exports.WysiwygEditorView = (0, react_1.memo)((props) => {
|
|
15
15
|
const { editor, autofocus, settingsVisible, toolbarVisible, toolbarConfig, hiddenActionsConfig, className, toolbarClassName, children, stickyToolbar = true, } = props;
|
|
16
16
|
(0, hooks_1.useRenderTime)((time) => {
|
|
17
|
-
logger_1.
|
|
17
|
+
logger_1.globalLogger.metrics({
|
|
18
|
+
component: 'wysiwyg-editor',
|
|
19
|
+
event: 'render',
|
|
20
|
+
duration: time,
|
|
21
|
+
});
|
|
22
|
+
editor.logger.metrics({
|
|
18
23
|
component: 'wysiwyg-editor',
|
|
19
24
|
event: 'render',
|
|
20
25
|
duration: time,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"WysiwygEditorView.js","sourceRoot":"../../../src","sources":["bundle/WysiwygEditorView.tsx"],"names":[],"mappings":";;;;AAAA,iCAA2B;AAE3B,+CAAqD;AACrD,uDAAqD;AACrD,
|
|
1
|
+
{"version":3,"file":"WysiwygEditorView.js","sourceRoot":"../../../src","sources":["bundle/WysiwygEditorView.tsx"],"names":[],"mappings":";;;;AAAA,iCAA2B;AAE3B,+CAAqD;AACrD,uDAAqD;AACrD,yCAAuC;AACvC,mDAAmD;AAGnD,kDAA0C;AAC1C,wEAAgE;AAGhE,mCAAkC;AAElC,MAAM,CAAC,GAAG,IAAA,cAAE,EAAC,gBAAgB,CAAC,CAAC;AAclB,QAAA,iBAAiB,GAAG,IAAA,YAAI,EAAyB,CAAC,KAAK,EAAE,EAAE;IACpE,MAAM,EACF,MAAM,EACN,SAAS,EACT,eAAe,EACf,cAAc,EACd,aAAa,EACb,mBAAmB,EACnB,SAAS,EACT,gBAAgB,EAChB,QAAQ,EACR,aAAa,GAAG,IAAI,GACvB,GAAG,KAAK,CAAC;IACV,IAAA,qBAAa,EAAC,CAAC,IAAI,EAAE,EAAE;QACnB,qBAAY,CAAC,OAAO,CAAC;YACjB,SAAS,EAAE,gBAAgB;YAC3B,KAAK,EAAE,QAAQ;YACf,QAAQ,EAAE,IAAI;SACjB,CAAC,CAAC;QACH,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC;YAClB,SAAS,EAAE,gBAAgB;YAC3B,KAAK,EAAE,QAAQ;YACf,QAAQ,EAAE,IAAI;SACjB,CAAC,CAAC;IACP,CAAC,CAAC,CAAC;IACH,OAAO,CACH,iCAAK,SAAS,EAAE,CAAC,CAAC,EAAC,OAAO,EAAE,cAAc,EAAC,EAAE,CAAC,SAAS,CAAC,CAAC,aACpD,cAAc,CAAC,CAAC,CAAC,CACd,uBAAC,yBAAW,IACR,MAAM,EAAE,MAAM,EACd,UAAU,EAAC,SAAS,EACpB,aAAa,EAAE,MAAM,EACrB,aAAa,EAAE,aAAa,EAC5B,aAAa,EAAE,aAAa,EAC5B,YAAY,EAAE,GAAG,EAAE,CAAC,MAAM,CAAC,KAAK,EAAE,EAClC,mBAAmB,EAAE,mBAAmB,EACxC,eAAe,EAAE,eAAe,EAChC,SAAS,EAAE,CAAC,CAAC,SAAS,EAAE,CAAC,gBAAgB,CAAC,CAAC,YAE1C,QAAQ,GACC,CACjB,CAAC,CAAC,CAAC,IAAI,EACR,uBAAC,+CAAsB,IAAC,SAAS,EAAE,SAAS,EAAE,MAAM,EAAE,MAAM,EAAE,SAAS,EAAE,CAAC,CAAC,QAAQ,CAAC,YAChF,uBAAC,mCAAsB,IAAC,OAAO,EAAE,MAAM,CAAC,aAAa,GAAI,GACpC,IACvB,CACT,CAAC;AACN,CAAC,CAAC,CAAC;AACH,yBAAiB,CAAC,WAAW,GAAG,0BAA0B,CAAC","sourcesContent":["import {memo} from 'react';\n\nimport {type ClassNameProps, cn} from '../classname';\nimport {ReactRendererComponent} from '../extensions';\nimport {globalLogger} from '../logger';\nimport {useRenderTime} from '../react-utils/hooks';\n\nimport type {EditorInt} from './Editor';\nimport {ToolbarView} from './ToolbarView';\nimport {WysiwygEditorComponent} from './WysiwygEditorComponent';\nimport type {WToolbarData, WToolbarItemData} from './toolbar/types';\n\nimport './WysiwygEditorView.scss';\n\nconst b = cn('wysiwyg-editor');\n\nexport type WysiwygEditorViewProps = ClassNameProps & {\n editor: EditorInt;\n autofocus?: boolean;\n settingsVisible?: boolean;\n toolbarConfig: WToolbarData;\n toolbarVisible?: boolean;\n stickyToolbar?: boolean;\n toolbarClassName?: string;\n hiddenActionsConfig?: WToolbarItemData[];\n children?: React.ReactNode;\n};\n\nexport const WysiwygEditorView = memo<WysiwygEditorViewProps>((props) => {\n const {\n editor,\n autofocus,\n settingsVisible,\n toolbarVisible,\n toolbarConfig,\n hiddenActionsConfig,\n className,\n toolbarClassName,\n children,\n stickyToolbar = true,\n } = props;\n useRenderTime((time) => {\n globalLogger.metrics({\n component: 'wysiwyg-editor',\n event: 'render',\n duration: time,\n });\n editor.logger.metrics({\n component: 'wysiwyg-editor',\n event: 'render',\n duration: time,\n });\n });\n return (\n <div className={b({toolbar: toolbarVisible}, [className])}>\n {toolbarVisible ? (\n <ToolbarView\n editor={editor}\n editorMode=\"wysiwyg\"\n toolbarEditor={editor}\n stickyToolbar={stickyToolbar}\n toolbarConfig={toolbarConfig}\n toolbarFocus={() => editor.focus()}\n hiddenActionsConfig={hiddenActionsConfig}\n settingsVisible={settingsVisible}\n className={b('toolbar', [toolbarClassName])}\n >\n {children}\n </ToolbarView>\n ) : null}\n <WysiwygEditorComponent autofocus={autofocus} editor={editor} className={b('editor')}>\n <ReactRendererComponent storage={editor.renderStorage} />\n </WysiwygEditorComponent>\n </div>\n );\n});\nWysiwygEditorView.displayName = 'MarkdownWysiwgEditorView';\n"]}
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import type { ReactNode } from 'react';
|
|
2
2
|
import type { MarkupString } from "../common/index.js";
|
|
3
3
|
import type { EscapeConfig, Extension } from "../core/index.js";
|
|
4
|
+
import type { Logger2 } from "../logger.js";
|
|
4
5
|
import type { CreateCodemirrorParams, YfmLangOptions } from "../markup/index.js";
|
|
5
6
|
import type { FileUploadHandler } from "../utils/index.js";
|
|
6
7
|
import type { DirectiveSyntaxContext, DirectiveSyntaxOption } from "../utils/directive.js";
|
|
@@ -176,4 +177,5 @@ export type MarkdownEditorOptions = {
|
|
|
176
177
|
markupConfig?: MarkdownEditorMarkupConfig;
|
|
177
178
|
/** Options for wysiwyg mode */
|
|
178
179
|
wysiwygConfig?: MarkdownEditorWysiwygConfig;
|
|
180
|
+
logger?: Logger2.ILogger;
|
|
179
181
|
};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.js","sourceRoot":"../../../src","sources":["bundle/types.ts"],"names":[],"mappings":";AAAA,mDAAmD","sourcesContent":["// public types, re-exported in src/bundle/index.ts\n\nimport type {ReactNode} from 'react';\n\nimport type {MarkupString} from '../common';\nimport type {EscapeConfig, Extension} from '../core';\nimport type {CreateCodemirrorParams, YfmLangOptions} from '../markup';\nimport type {FileUploadHandler} from '../utils';\nimport type {DirectiveSyntaxContext, DirectiveSyntaxOption} from '../utils/directive';\n\nimport type {ChangeEditorModeOptions} from './Editor';\nimport type {ExtensionsOptions as WysiwygPresetExtensionsOptions} from './wysiwyg-preset';\n\nexport type {Editor as MarkdownEditorInstance} from './Editor';\nexport type MarkdownEditorMode = 'wysiwyg' | 'markup';\nexport type MarkdownEditorPreset = 'zero' | 'commonmark' | 'default' | 'yfm' | 'full';\nexport type MarkdownEditorSplitMode = false | 'horizontal' | 'vertical';\n\nexport type RenderPreviewParams = {\n getValue: () => MarkupString;\n mode: 'preview' | 'split';\n md: Readonly<MarkdownEditorMdOptions>;\n directiveSyntax: Pick<DirectiveSyntaxContext, 'option' | 'valueFor' | 'mdPluginValueFor'>;\n};\nexport type RenderPreview = (params: RenderPreviewParams) => ReactNode;\n\nexport type ParseInsertedUrlAsImage = (text: string) => {imageUrl: string; title?: string} | null;\n\nexport type WysiwygPlaceholderOptions = {\n value?: string | (() => string);\n /** Default – empty-doc\n Values:\n - 'empty-doc' – The placeholder will only be shown when the document is completely empty;\n - 'empty-row-top-level' – The placeholder will be displayed in an empty line that is at the top level of the document structure;\n - 'empty-row' – The placeholder will be shown in any empty line within the document, regardless of its nesting level.\n */\n behavior?: 'empty-doc' | 'empty-row-top-level' | 'empty-row';\n};\n\nexport type MarkdownEditorMdOptions = {\n html?: boolean;\n breaks?: boolean;\n linkify?: boolean;\n linkifyTlds?: string | string[];\n};\n\nexport type MarkdownEditorInitialOptions = {\n markup?: MarkupString;\n /** Default – wysiwyg */\n mode?: MarkdownEditorMode;\n /** Default – true */\n toolbarVisible?: boolean;\n /**\n * Default – false\n *\n * Note: has no effect if `MarkdownEditorMarkupConfig.splitMode` is set to false or is not set.\n */\n splitModeEnabled?: boolean;\n};\n\nexport type MarkdownEditorHandlers = {\n /** Pass this handler to allow uploading files from device. */\n uploadFile?: FileUploadHandler;\n};\n\nexport type MarkdownEditorExperimentalOptions = {\n /**\n * If we need to set dimensions for uploaded images\n *\n * @default false\n */\n needToSetDimensionsForUploadedImages?: boolean;\n /**\n * If we need to enable new image size calculations\n *\n * @default false\n */\n enableNewImageSizeCalculation?: boolean;\n /**\n * Called before switching from the markup editor to the wysiwyg editor.\n * You can use it to pre-process the value from the markup editor before it gets into the wysiwyg editor.\n */\n prepareRawMarkup?: (value: MarkupString) => MarkupString;\n beforeEditorModeChange?: (\n options: Pick<ChangeEditorModeOptions, 'mode' | 'reason'>,\n ) => boolean | undefined;\n /**\n * Enables support of directive syntax for diplodoc (YFM) extensions.\n *\n * **Note:** This setting affects parsing of markdown markup and serializing to markdown markup.\n * Be careful with it and use it in consistency with diplodoc/transform and diplodoc-extensions.\n *\n * Before enabling this option, make sure that appropriate versions of diplodoc/transform and diplodoc-extensions are installed.\n *\n * You can pass an object in `key:value` format to provide different behaviour for each extension individually.\n *\n * Values:\n * - 'disabled' – directive syntax is disabled;\n * - 'enabled' – directive syntax is enabled. Syntax of existing blocks is preserved. New blocks will be serialized using old syntax;\n * - 'preserve' – directive syntax is enabled. Syntax of existing blocks is preserved. New blocks will be serialized using directive syntax;\n * - 'overwrite' – existing blocks will be overwritten using directive syntax through serialization;\n * - 'only' – old syntax is disabled, only directive syntax available. Blocks in old syntax will not be parsed.\n *\n * Default value is 'disabled'.\n */\n directiveSyntax?: DirectiveSyntaxOption;\n /**\n * If we need support for empty strings\n *\n * @default false\n */\n preserveEmptyRows?: boolean;\n /**\n * Preserves the original formatting of unmodified blocks,\n * restoring their structure during serialization\n *\n * **Use case:** Maintain consistent markup when switching modes\n *\n * **Note:** Applies to tracked blocks: `yfm_table`\n *\n * @default false\n */\n preserveMarkupFormatting?: boolean;\n};\n\nexport type MarkdownEditorMarkupConfig = {\n /**\n * Pass the rendering function to preview the markdown content.\n *\n * It is also used for split view rendering.\n *\n * If false is passed, preview will be disabled.\n */\n renderPreview?: RenderPreview;\n /**\n * Pass position of split view.\n *\n * Note: for enable split view, you need to pass renderPreview function too.\n *\n * If false is passed, split view will be disabled.\n */\n splitMode?: MarkdownEditorSplitMode;\n /** Additional extensions for codemirror instance. */\n extensions?: CreateCodemirrorParams['extensions'];\n /** Can be used to disable some of the default extensions */\n disabledExtensions?: CreateCodemirrorParams['disabledExtensions'];\n /** Additional keymaps for codemirror instance */\n keymaps?: CreateCodemirrorParams['keymaps'];\n /** Overrides the default placeholder content. */\n placeholder?: CreateCodemirrorParams['placeholder'];\n /** Enable HTML parsing when pasting content. */\n parseHtmlOnPaste?: boolean;\n /**\n * Additional language data for markdown language in codemirror.\n * Can be used to configure additional autocompletions and others.\n * See more https://codemirror.net/docs/ref/#state.EditorState.languageDataAt\n */\n languageData?: YfmLangOptions['languageData'];\n /** Config for @codemirror/autocomplete https://codemirror.net/docs/ref/#autocomplete.autocompletion%5Econfig */\n autocompletion?: CreateCodemirrorParams['autocompletion'];\n /**\n * The function, used to determine if the pasted text is the image url and should be inserted as an image\n */\n parseInsertedUrlAsImage?: ParseInsertedUrlAsImage;\n};\n\n// do not export this type\ntype ExtensionsOptions<T extends object = {}> = Omit<\n WysiwygPresetExtensionsOptions,\n 'reactRenderer'\n> &\n T;\n\nexport type MarkdownEditorWysiwygConfig = {\n /** Additional extensions */\n extensions?: Extension;\n extensionOptions?: ExtensionsOptions;\n escapeConfig?: EscapeConfig;\n placeholderOptions?: WysiwygPlaceholderOptions;\n};\n\nexport type MarkdownEditorOptions = {\n /**\n * A set of plug-in extensions.\n *\n * @default 'full'\n */\n preset?: MarkdownEditorPreset;\n /** Markdown parser options */\n md?: MarkdownEditorMdOptions;\n /** Initial values */\n initial?: MarkdownEditorInitialOptions;\n handlers?: MarkdownEditorHandlers;\n experimental?: MarkdownEditorExperimentalOptions;\n /** Options for markup mode */\n markupConfig?: MarkdownEditorMarkupConfig;\n /** Options for wysiwyg mode */\n wysiwygConfig?: MarkdownEditorWysiwygConfig;\n};\n"]}
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"../../../src","sources":["bundle/types.ts"],"names":[],"mappings":";AAAA,mDAAmD","sourcesContent":["// public types, re-exported in src/bundle/index.ts\n\nimport type {ReactNode} from 'react';\n\nimport type {MarkupString} from '../common';\nimport type {EscapeConfig, Extension} from '../core';\nimport type {Logger2} from '../logger';\nimport type {CreateCodemirrorParams, YfmLangOptions} from '../markup';\nimport type {FileUploadHandler} from '../utils';\nimport type {DirectiveSyntaxContext, DirectiveSyntaxOption} from '../utils/directive';\n\nimport type {ChangeEditorModeOptions} from './Editor';\nimport type {ExtensionsOptions as WysiwygPresetExtensionsOptions} from './wysiwyg-preset';\n\nexport type {Editor as MarkdownEditorInstance} from './Editor';\nexport type MarkdownEditorMode = 'wysiwyg' | 'markup';\nexport type MarkdownEditorPreset = 'zero' | 'commonmark' | 'default' | 'yfm' | 'full';\nexport type MarkdownEditorSplitMode = false | 'horizontal' | 'vertical';\n\nexport type RenderPreviewParams = {\n getValue: () => MarkupString;\n mode: 'preview' | 'split';\n md: Readonly<MarkdownEditorMdOptions>;\n directiveSyntax: Pick<DirectiveSyntaxContext, 'option' | 'valueFor' | 'mdPluginValueFor'>;\n};\nexport type RenderPreview = (params: RenderPreviewParams) => ReactNode;\n\nexport type ParseInsertedUrlAsImage = (text: string) => {imageUrl: string; title?: string} | null;\n\nexport type WysiwygPlaceholderOptions = {\n value?: string | (() => string);\n /** Default – empty-doc\n Values:\n - 'empty-doc' – The placeholder will only be shown when the document is completely empty;\n - 'empty-row-top-level' – The placeholder will be displayed in an empty line that is at the top level of the document structure;\n - 'empty-row' – The placeholder will be shown in any empty line within the document, regardless of its nesting level.\n */\n behavior?: 'empty-doc' | 'empty-row-top-level' | 'empty-row';\n};\n\nexport type MarkdownEditorMdOptions = {\n html?: boolean;\n breaks?: boolean;\n linkify?: boolean;\n linkifyTlds?: string | string[];\n};\n\nexport type MarkdownEditorInitialOptions = {\n markup?: MarkupString;\n /** Default – wysiwyg */\n mode?: MarkdownEditorMode;\n /** Default – true */\n toolbarVisible?: boolean;\n /**\n * Default – false\n *\n * Note: has no effect if `MarkdownEditorMarkupConfig.splitMode` is set to false or is not set.\n */\n splitModeEnabled?: boolean;\n};\n\nexport type MarkdownEditorHandlers = {\n /** Pass this handler to allow uploading files from device. */\n uploadFile?: FileUploadHandler;\n};\n\nexport type MarkdownEditorExperimentalOptions = {\n /**\n * If we need to set dimensions for uploaded images\n *\n * @default false\n */\n needToSetDimensionsForUploadedImages?: boolean;\n /**\n * If we need to enable new image size calculations\n *\n * @default false\n */\n enableNewImageSizeCalculation?: boolean;\n /**\n * Called before switching from the markup editor to the wysiwyg editor.\n * You can use it to pre-process the value from the markup editor before it gets into the wysiwyg editor.\n */\n prepareRawMarkup?: (value: MarkupString) => MarkupString;\n beforeEditorModeChange?: (\n options: Pick<ChangeEditorModeOptions, 'mode' | 'reason'>,\n ) => boolean | undefined;\n /**\n * Enables support of directive syntax for diplodoc (YFM) extensions.\n *\n * **Note:** This setting affects parsing of markdown markup and serializing to markdown markup.\n * Be careful with it and use it in consistency with diplodoc/transform and diplodoc-extensions.\n *\n * Before enabling this option, make sure that appropriate versions of diplodoc/transform and diplodoc-extensions are installed.\n *\n * You can pass an object in `key:value` format to provide different behaviour for each extension individually.\n *\n * Values:\n * - 'disabled' – directive syntax is disabled;\n * - 'enabled' – directive syntax is enabled. Syntax of existing blocks is preserved. New blocks will be serialized using old syntax;\n * - 'preserve' – directive syntax is enabled. Syntax of existing blocks is preserved. New blocks will be serialized using directive syntax;\n * - 'overwrite' – existing blocks will be overwritten using directive syntax through serialization;\n * - 'only' – old syntax is disabled, only directive syntax available. Blocks in old syntax will not be parsed.\n *\n * Default value is 'disabled'.\n */\n directiveSyntax?: DirectiveSyntaxOption;\n /**\n * If we need support for empty strings\n *\n * @default false\n */\n preserveEmptyRows?: boolean;\n /**\n * Preserves the original formatting of unmodified blocks,\n * restoring their structure during serialization\n *\n * **Use case:** Maintain consistent markup when switching modes\n *\n * **Note:** Applies to tracked blocks: `yfm_table`\n *\n * @default false\n */\n preserveMarkupFormatting?: boolean;\n};\n\nexport type MarkdownEditorMarkupConfig = {\n /**\n * Pass the rendering function to preview the markdown content.\n *\n * It is also used for split view rendering.\n *\n * If false is passed, preview will be disabled.\n */\n renderPreview?: RenderPreview;\n /**\n * Pass position of split view.\n *\n * Note: for enable split view, you need to pass renderPreview function too.\n *\n * If false is passed, split view will be disabled.\n */\n splitMode?: MarkdownEditorSplitMode;\n /** Additional extensions for codemirror instance. */\n extensions?: CreateCodemirrorParams['extensions'];\n /** Can be used to disable some of the default extensions */\n disabledExtensions?: CreateCodemirrorParams['disabledExtensions'];\n /** Additional keymaps for codemirror instance */\n keymaps?: CreateCodemirrorParams['keymaps'];\n /** Overrides the default placeholder content. */\n placeholder?: CreateCodemirrorParams['placeholder'];\n /** Enable HTML parsing when pasting content. */\n parseHtmlOnPaste?: boolean;\n /**\n * Additional language data for markdown language in codemirror.\n * Can be used to configure additional autocompletions and others.\n * See more https://codemirror.net/docs/ref/#state.EditorState.languageDataAt\n */\n languageData?: YfmLangOptions['languageData'];\n /** Config for @codemirror/autocomplete https://codemirror.net/docs/ref/#autocomplete.autocompletion%5Econfig */\n autocompletion?: CreateCodemirrorParams['autocompletion'];\n /**\n * The function, used to determine if the pasted text is the image url and should be inserted as an image\n */\n parseInsertedUrlAsImage?: ParseInsertedUrlAsImage;\n};\n\n// do not export this type\ntype ExtensionsOptions<T extends object = {}> = Omit<\n WysiwygPresetExtensionsOptions,\n 'reactRenderer'\n> &\n T;\n\nexport type MarkdownEditorWysiwygConfig = {\n /** Additional extensions */\n extensions?: Extension;\n extensionOptions?: ExtensionsOptions;\n escapeConfig?: EscapeConfig;\n placeholderOptions?: WysiwygPlaceholderOptions;\n};\n\nexport type MarkdownEditorOptions = {\n /**\n * A set of plug-in extensions.\n *\n * @default 'full'\n */\n preset?: MarkdownEditorPreset;\n /** Markdown parser options */\n md?: MarkdownEditorMdOptions;\n /** Initial values */\n initial?: MarkdownEditorInitialOptions;\n handlers?: MarkdownEditorHandlers;\n experimental?: MarkdownEditorExperimentalOptions;\n /** Options for markup mode */\n markupConfig?: MarkdownEditorMarkupConfig;\n /** Options for wysiwyg mode */\n wysiwygConfig?: MarkdownEditorWysiwygConfig;\n logger?: Logger2.ILogger;\n};\n"]}
|