Skip to content

Commit 9bf6d5d

Browse files
authored
feat(bundle): improve drilling of codemirror config (#323)
1 parent 5fff3ca commit 9bf6d5d

File tree

3 files changed

+26
-12
lines changed

3 files changed

+26
-12
lines changed

src/bundle/Editor.ts

Lines changed: 19 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@ import {ActionStorage, WysiwygEditor, WysiwygEditorOptions} from '../core';
99
import {ReactRenderStorage, RenderStorage} from '../extensions';
1010
import {i18n} from '../i18n/bundle';
1111
import {logger} from '../logger';
12-
import {createCodemirror} from '../markup/codemirror';
12+
import {type CreateCodemirrorParams, createCodemirror} from '../markup/codemirror';
1313
import type {YfmLangOptions} from '../markup/codemirror/yfm';
1414
import {CodeEditor, Editor as MarkupEditor} from '../markup/editor';
1515
import {Emitter, Receiver, SafeEventEmitter} from '../utils/event-emitter';
@@ -108,6 +108,17 @@ type ChangeEditorModeOptions = {
108108
reason: 'error-boundary' | 'settings' | 'manually';
109109
};
110110

111+
export type MarkupConfig = {
112+
/** Additional extensions for codemirror instance. */
113+
extensions?: CreateCodemirrorParams['extensions'];
114+
/**
115+
* Additional language data for markdown language in codemirror.
116+
* Can be used to configure additional autocompletions and others.
117+
* See more https://codemirror.net/docs/ref/#state.EditorState.languageDataAt
118+
*/
119+
languageData?: YfmLangOptions['languageData'];
120+
};
121+
111122
export type EditorOptions = Pick<
112123
WysiwygEditorOptions,
113124
'allowHTML' | 'linkify' | 'linkifyTlds' | 'extensions'
@@ -137,8 +148,9 @@ export type EditorOptions = Pick<
137148
splitMode?: SplitMode;
138149
renderPreview?: RenderPreview;
139150
preset: EditorPreset;
151+
/** @deprecated Put extra extensions via MarkdownEditorMarkupConfig */
140152
extraMarkupExtensions?: CodemirrorExtension[];
141-
yfmLangOptions?: YfmLangOptions;
153+
markupConfig?: MarkupConfig;
142154
};
143155

144156
/** @internal */
@@ -151,8 +163,7 @@ export class EditorImpl extends SafeEventEmitter<EventMapInt> implements EditorI
151163
#renderPreview?: RenderPreview;
152164
#wysiwygEditor?: WysiwygEditor;
153165
#markupEditor?: MarkupEditor;
154-
#extraMarkupExtensions?: CodemirrorExtension[];
155-
#yfmLangOptions?: YfmLangOptions;
166+
#markupConfig: MarkupConfig;
156167

157168
readonly #preset: EditorPreset;
158169
#allowHTML?: boolean;
@@ -275,8 +286,8 @@ export class EditorImpl extends SafeEventEmitter<EventMapInt> implements EditorI
275286
reactRenderer: this.#renderStorage,
276287
uploadHandler: this.fileUploadHandler,
277288
needImgDimms: this.needToSetDimensionsForUploadedImages,
278-
extraMarkupExtensions: this.#extraMarkupExtensions,
279-
yfmLangOptions: this.#yfmLangOptions,
289+
extensions: this.#markupConfig.extensions,
290+
yfmLangOptions: {languageData: this.#markupConfig.languageData},
280291
receiver: this,
281292
}),
282293
);
@@ -311,8 +322,8 @@ export class EditorImpl extends SafeEventEmitter<EventMapInt> implements EditorI
311322
this.#linkifyTlds = opts.linkifyTlds;
312323
this.#allowHTML = opts.allowHTML;
313324
this.#extensions = opts.extensions;
314-
this.#extraMarkupExtensions = opts.extraMarkupExtensions;
315-
this.#yfmLangOptions = opts.yfmLangOptions;
325+
this.#markupConfig = {...opts.markupConfig};
326+
this.#markupConfig.extensions ??= opts.extraMarkupExtensions;
316327

317328
this.#renderStorage = opts.renderStorage;
318329
this.#fileUploadHandler = opts.fileUploadHandler;

src/bundle/index.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@ export type {
22
Editor as MarkdownEditorInstance,
33
EditorMode as MarkdownEditorMode,
44
EditorPreset as MarkdownEditorPreset,
5+
MarkupConfig as MarkdownEditorMarkupConfig,
56
RenderPreview,
67
SplitMode,
78
} from './Editor';

src/markup/codemirror/create.ts

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -41,6 +41,8 @@ import {ReactRendererFacet} from './react-facet';
4141
import {SearchPanelPlugin} from './search-plugin/plugin';
4242
import {type YfmLangOptions, yfmLang} from './yfm';
4343

44+
export type {YfmLangOptions};
45+
4446
export type CreateCodemirrorParams = {
4547
doc: EditorViewConfig['doc'];
4648
placeholderText: string;
@@ -52,7 +54,7 @@ export type CreateCodemirrorParams = {
5254
reactRenderer: ReactRenderStorage;
5355
uploadHandler?: FileUploadHandler;
5456
needImgDimms?: boolean;
55-
extraMarkupExtensions?: Extension[];
57+
extensions?: Extension[];
5658
receiver?: Receiver<EventMap>;
5759
yfmLangOptions?: YfmLangOptions;
5860
};
@@ -67,7 +69,7 @@ export function createCodemirror(params: CreateCodemirrorParams) {
6769
onSubmit,
6870
onChange,
6971
onDocChange,
70-
extraMarkupExtensions,
72+
extensions: extraExtensions,
7173
receiver,
7274
yfmLangOptions,
7375
} = params;
@@ -138,8 +140,8 @@ export function createCodemirror(params: CreateCodemirrorParams) {
138140
}),
139141
);
140142
}
141-
if (extraMarkupExtensions) {
142-
extensions.push(...extraMarkupExtensions);
143+
if (extraExtensions) {
144+
extensions.push(...extraExtensions);
143145
}
144146

145147
return new EditorView({

0 commit comments

Comments
 (0)