@gravity-ui/markdown-editor 14.9.0 → 14.10.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/build/cjs/bundle/Editor.d.ts +2 -0
- package/build/cjs/bundle/Editor.js +15 -4
- package/build/cjs/bundle/MarkdownEditorView.js +2 -2
- package/build/cjs/bundle/config/action-names.d.ts +1 -1
- package/build/cjs/bundle/config/action-names.js +1 -0
- package/build/cjs/bundle/toolbar/utils/flattenPreset.d.ts +2 -0
- package/build/cjs/bundle/toolbar/utils/flattenPreset.js +14 -0
- package/build/cjs/bundle/toolbar/utils/toolbarsConfigs.d.ts +17 -0
- package/build/cjs/bundle/toolbar/{utils.js → utils/toolbarsConfigs.js} +15 -19
- package/build/cjs/bundle/types.d.ts +6 -0
- package/build/cjs/bundle/useMarkdownEditor.js +8 -2
- package/build/cjs/bundle/wysiwyg-preset.d.ts +1 -0
- package/build/cjs/bundle/wysiwyg-preset.js +1 -1
- package/build/cjs/core/Editor.d.ts +3 -1
- package/build/cjs/core/Editor.js +2 -1
- package/build/cjs/core/ExtensionsManager.d.ts +2 -0
- package/build/cjs/core/ExtensionsManager.js +8 -4
- package/build/cjs/core/ParserTokensRegistry.d.ts +2 -1
- package/build/cjs/core/ParserTokensRegistry.js +2 -2
- package/build/cjs/core/markdown/MarkdownParser.d.ts +3 -1
- package/build/cjs/core/markdown/MarkdownParser.js +5 -2
- package/build/cjs/core/markdown/MarkdownSerializer.js +1 -1
- package/build/cjs/core/markdown/ProseMirrorTransformer/emptyRowTransformer.d.ts +2 -0
- package/build/cjs/core/markdown/ProseMirrorTransformer/emptyRowTransformer.js +15 -0
- package/build/cjs/core/markdown/ProseMirrorTransformer/getTransformers.d.ts +7 -0
- package/build/cjs/core/markdown/ProseMirrorTransformer/getTransformers.js +13 -0
- package/build/cjs/core/markdown/ProseMirrorTransformer/index.d.ts +15 -0
- package/build/cjs/core/markdown/ProseMirrorTransformer/index.js +25 -0
- package/build/cjs/extensions/additional/Math/MathSpecs/index.js +1 -0
- package/build/cjs/extensions/base/BaseSchema/BaseSchemaSpecs/index.d.ts +1 -0
- package/build/cjs/extensions/base/BaseSchema/BaseSchemaSpecs/index.js +23 -3
- package/build/cjs/extensions/behavior/Selection/selection.js +1 -5
- package/build/cjs/extensions/markdown/Blockquote/BlockquoteSpecs/index.js +1 -0
- package/build/cjs/extensions/markdown/CodeBlock/commands.js +1 -1
- package/build/cjs/extensions/markdown/HorizontalRule/HorizontalRuleSpecs/index.js +1 -0
- package/build/cjs/extensions/yfm/YfmTabs/YfmTabsSpecs/schema.js +1 -0
- package/build/cjs/i18n/empty-row/en.json +3 -0
- package/build/cjs/i18n/empty-row/index.d.ts +5 -0
- package/build/cjs/i18n/empty-row/index.js +9 -0
- package/build/cjs/i18n/empty-row/ru.json +3 -0
- package/build/cjs/i18n/yfm-note/index.d.ts +1 -1
- package/build/cjs/index.d.ts +1 -0
- package/build/cjs/index.js +1 -0
- package/build/cjs/markup/codemirror/autocomplete/emptyRow.d.ts +9 -0
- package/build/cjs/markup/codemirror/autocomplete/emptyRow.js +26 -0
- package/build/cjs/markup/codemirror/autocomplete/index.d.ts +5 -0
- package/build/cjs/markup/codemirror/autocomplete/index.js +14 -0
- package/build/cjs/markup/codemirror/create.d.ts +1 -0
- package/build/cjs/markup/codemirror/create.js +6 -1
- package/build/cjs/markup/codemirror/yfm.d.ts +2 -1
- package/build/cjs/markup/codemirror/yfm.js +3 -3
- package/build/cjs/markup/commands/emptyRow.d.ts +2 -0
- package/build/cjs/markup/commands/emptyRow.js +43 -0
- package/build/cjs/markup/commands/index.d.ts +1 -0
- package/build/cjs/markup/commands/index.js +1 -0
- package/build/cjs/shortcuts/const.d.ts +1 -0
- package/build/cjs/shortcuts/const.js +1 -0
- package/build/cjs/shortcuts/default.js +1 -0
- package/build/cjs/version.js +1 -1
- package/build/esm/bundle/Editor.d.ts +2 -0
- package/build/esm/bundle/Editor.js +15 -4
- package/build/esm/bundle/MarkdownEditorView.js +1 -1
- package/build/esm/bundle/config/action-names.d.ts +1 -1
- package/build/esm/bundle/config/action-names.js +1 -0
- package/build/esm/bundle/toolbar/utils/flattenPreset.d.ts +2 -0
- package/build/esm/bundle/toolbar/utils/flattenPreset.js +10 -0
- package/build/esm/bundle/toolbar/utils/toolbarsConfigs.d.ts +17 -0
- package/build/esm/bundle/toolbar/{utils.js → utils/toolbarsConfigs.js} +13 -17
- package/build/esm/bundle/types.d.ts +6 -0
- package/build/esm/bundle/useMarkdownEditor.js +8 -2
- package/build/esm/bundle/wysiwyg-preset.d.ts +1 -0
- package/build/esm/bundle/wysiwyg-preset.js +1 -1
- package/build/esm/core/Editor.d.ts +3 -1
- package/build/esm/core/Editor.js +2 -1
- package/build/esm/core/ExtensionsManager.d.ts +2 -0
- package/build/esm/core/ExtensionsManager.js +8 -4
- package/build/esm/core/ParserTokensRegistry.d.ts +2 -1
- package/build/esm/core/ParserTokensRegistry.js +2 -2
- package/build/esm/core/markdown/MarkdownParser.d.ts +3 -1
- package/build/esm/core/markdown/MarkdownParser.js +5 -2
- package/build/esm/core/markdown/MarkdownSerializer.js +1 -1
- package/build/esm/core/markdown/ProseMirrorTransformer/emptyRowTransformer.d.ts +2 -0
- package/build/esm/core/markdown/ProseMirrorTransformer/emptyRowTransformer.js +11 -0
- package/build/esm/core/markdown/ProseMirrorTransformer/getTransformers.d.ts +7 -0
- package/build/esm/core/markdown/ProseMirrorTransformer/getTransformers.js +9 -0
- package/build/esm/core/markdown/ProseMirrorTransformer/index.d.ts +15 -0
- package/build/esm/core/markdown/ProseMirrorTransformer/index.js +21 -0
- package/build/esm/extensions/additional/Math/MathSpecs/index.js +1 -0
- package/build/esm/extensions/base/BaseSchema/BaseSchemaSpecs/index.d.ts +1 -0
- package/build/esm/extensions/base/BaseSchema/BaseSchemaSpecs/index.js +23 -3
- package/build/esm/extensions/behavior/Selection/selection.js +1 -5
- package/build/esm/extensions/markdown/Blockquote/BlockquoteSpecs/index.js +1 -0
- package/build/esm/extensions/markdown/CodeBlock/commands.js +1 -1
- package/build/esm/extensions/markdown/HorizontalRule/HorizontalRuleSpecs/index.js +1 -0
- package/build/esm/extensions/yfm/YfmTabs/YfmTabsSpecs/schema.js +1 -0
- package/build/esm/i18n/empty-row/en.json +3 -0
- package/build/esm/i18n/empty-row/index.d.ts +5 -0
- package/build/esm/i18n/empty-row/index.js +5 -0
- package/build/esm/i18n/empty-row/ru.json +3 -0
- package/build/esm/i18n/yfm-note/index.d.ts +1 -1
- package/build/esm/index.d.ts +1 -0
- package/build/esm/index.js +1 -0
- package/build/esm/markup/codemirror/autocomplete/emptyRow.d.ts +9 -0
- package/build/esm/markup/codemirror/autocomplete/emptyRow.js +23 -0
- package/build/esm/markup/codemirror/autocomplete/index.d.ts +5 -0
- package/build/esm/markup/codemirror/autocomplete/index.js +10 -0
- package/build/esm/markup/codemirror/create.d.ts +1 -0
- package/build/esm/markup/codemirror/create.js +7 -2
- package/build/esm/markup/codemirror/yfm.d.ts +2 -1
- package/build/esm/markup/codemirror/yfm.js +1 -1
- package/build/esm/markup/commands/emptyRow.d.ts +2 -0
- package/build/esm/markup/commands/emptyRow.js +39 -0
- package/build/esm/markup/commands/index.d.ts +1 -0
- package/build/esm/markup/commands/index.js +1 -0
- package/build/esm/shortcuts/const.d.ts +1 -0
- package/build/esm/shortcuts/const.js +1 -0
- package/build/esm/shortcuts/default.js +1 -0
- package/build/esm/version.js +1 -1
- package/package.json +1 -1
- package/build/cjs/bundle/toolbar/utils.d.ts +0 -17
- package/build/esm/bundle/toolbar/utils.d.ts +0 -17
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import { useLayoutEffect, useMemo } from 'react';
|
|
2
|
+
import { getPMTransformers } from '../core/markdown/ProseMirrorTransformer/getTransformers';
|
|
2
3
|
import { ReactRenderStorage } from '../extensions';
|
|
3
4
|
import { logger } from '../logger';
|
|
4
5
|
import { DirectiveSyntaxContext } from '../utils/directive';
|
|
@@ -10,11 +11,15 @@ export function useMarkdownEditor(props, deps = []) {
|
|
|
10
11
|
var _a, _b, _c, _d, _e, _f, _g, _h, _j, _k, _l, _m, _o, _p, _q, _r, _s;
|
|
11
12
|
const { md = {}, initial = {}, handlers = {}, experimental = {}, markupConfig = {}, wysiwygConfig = {}, } = props;
|
|
12
13
|
const breaks = (_a = md.breaks) !== null && _a !== void 0 ? _a : props.breaks;
|
|
14
|
+
const preserveEmptyRows = experimental.preserveEmptyRows;
|
|
13
15
|
const preset = (_b = props.preset) !== null && _b !== void 0 ? _b : 'full';
|
|
14
16
|
const renderStorage = new ReactRenderStorage();
|
|
15
17
|
const uploadFile = (_c = handlers.uploadFile) !== null && _c !== void 0 ? _c : props.fileUploadHandler;
|
|
16
18
|
const needToSetDimensionsForUploadedImages = (_d = experimental.needToSetDimensionsForUploadedImages) !== null && _d !== void 0 ? _d : props.needToSetDimensionsForUploadedImages;
|
|
17
19
|
const enableNewImageSizeCalculation = experimental.enableNewImageSizeCalculation;
|
|
20
|
+
const pmTransformers = getPMTransformers({
|
|
21
|
+
emptyRowTransformer: preserveEmptyRows,
|
|
22
|
+
});
|
|
18
23
|
const directiveSyntax = new DirectiveSyntaxContext(experimental.directiveSyntax);
|
|
19
24
|
const extensions = (builder) => {
|
|
20
25
|
var _a;
|
|
@@ -26,7 +31,7 @@ export function useMarkdownEditor(props, deps = []) {
|
|
|
26
31
|
}, onSubmit: () => {
|
|
27
32
|
editor.emit('submit', null);
|
|
28
33
|
return true;
|
|
29
|
-
}, placeholderOptions: wysiwygConfig.placeholderOptions, mdBreaks: breaks, fileUploadHandler: uploadFile, needToSetDimensionsForUploadedImages,
|
|
34
|
+
}, preserveEmptyRows: preserveEmptyRows, placeholderOptions: wysiwygConfig.placeholderOptions, mdBreaks: breaks, fileUploadHandler: uploadFile, needToSetDimensionsForUploadedImages,
|
|
30
35
|
enableNewImageSizeCalculation }));
|
|
31
36
|
{
|
|
32
37
|
const extraExtensions = wysiwygConfig.extensions || props.extraExtensions;
|
|
@@ -37,7 +42,8 @@ export function useMarkdownEditor(props, deps = []) {
|
|
|
37
42
|
};
|
|
38
43
|
return new EditorImpl(Object.assign(Object.assign({}, props), { preset,
|
|
39
44
|
renderStorage,
|
|
40
|
-
directiveSyntax,
|
|
45
|
+
directiveSyntax,
|
|
46
|
+
pmTransformers, md: Object.assign(Object.assign({}, md), { breaks, html: (_e = md.html) !== null && _e !== void 0 ? _e : props.allowHTML, linkify: (_f = md.linkify) !== null && _f !== void 0 ? _f : props.linkify, linkifyTlds: (_g = md.linkifyTlds) !== null && _g !== void 0 ? _g : props.linkifyTlds }), initial: Object.assign(Object.assign({}, initial), { markup: (_h = initial.markup) !== null && _h !== void 0 ? _h : props.initialMarkup, mode: (_j = initial.mode) !== null && _j !== void 0 ? _j : props.initialEditorMode, toolbarVisible: (_k = initial.toolbarVisible) !== null && _k !== void 0 ? _k : props.initialToolbarVisible, splitModeEnabled: (_l = initial.splitModeEnabled) !== null && _l !== void 0 ? _l : props.initialSplitModeEnabled }), handlers: Object.assign(Object.assign({}, handlers), { uploadFile }), experimental: Object.assign(Object.assign({}, experimental), { needToSetDimensionsForUploadedImages,
|
|
41
47
|
enableNewImageSizeCalculation, prepareRawMarkup: (_m = experimental.prepareRawMarkup) !== null && _m !== void 0 ? _m : props.prepareRawMarkup, beforeEditorModeChange: (_o = experimental.beforeEditorModeChange) !== null && _o !== void 0 ? _o : props.experimental_beforeEditorModeChange }), markupConfig: Object.assign(Object.assign({}, markupConfig), { splitMode: (_p = markupConfig.splitMode) !== null && _p !== void 0 ? _p : props.splitMode, renderPreview: (_q = markupConfig.renderPreview) !== null && _q !== void 0 ? _q : props.renderPreview, extensions: (_r = markupConfig.extensions) !== null && _r !== void 0 ? _r : props.extraMarkupExtensions }), wysiwygConfig: Object.assign(Object.assign({}, wysiwygConfig), { extensions, escapeConfig: (_s = wysiwygConfig.escapeConfig) !== null && _s !== void 0 ? _s : props.escapeConfig }) }));
|
|
42
48
|
}, deps);
|
|
43
49
|
useLayoutEffect(() => {
|
|
@@ -9,6 +9,7 @@ export declare type ExtensionsOptions = BehaviorPresetOptions & FullPresetOption
|
|
|
9
9
|
export declare type BundlePresetOptions = ExtensionsOptions & EditorModeKeymapOptions & {
|
|
10
10
|
preset: MarkdownEditorPreset;
|
|
11
11
|
mdBreaks?: boolean;
|
|
12
|
+
preserveEmptyRows?: boolean;
|
|
12
13
|
fileUploadHandler?: FileUploadHandler;
|
|
13
14
|
placeholderOptions?: WysiwygPlaceholderOptions;
|
|
14
15
|
/**
|
|
@@ -31,7 +31,7 @@ export const BundlePreset = (builder, opts) => {
|
|
|
31
31
|
return typeof value === 'function'
|
|
32
32
|
? value()
|
|
33
33
|
: value !== null && value !== void 0 ? value : i18nPlaceholder('doc_empty');
|
|
34
|
-
} }, opts.baseSchema) });
|
|
34
|
+
}, preserveEmptyRows: opts.preserveEmptyRows }, opts.baseSchema) });
|
|
35
35
|
const commonMarkOptions = Object.assign(Object.assign({}, zeroOptions), { selectionContext: Object.assign({ config: wSelectionMenuConfigByPreset.commonmark }, opts.selectionContext), commandMenu: Object.assign({ actions: wCommandMenuConfigByPreset.commonmark }, opts.commandMenu), breaks: Object.assign({ preferredBreak: (opts.mdBreaks ? 'soft' : 'hard') }, opts.breaks), bold: Object.assign({ boldKey: f.toPM(A.Bold) }, opts.bold), italic: Object.assign({ italicKey: f.toPM(A.Italic) }, opts.italic), code: Object.assign({ codeKey: f.toPM(A.Code) }, opts.code), codeBlock: Object.assign({ codeBlockKey: f.toPM(A.CodeBlock) }, opts.codeBlock), blockquote: Object.assign({ qouteKey: f.toPM(A.Quote) }, opts.blockquote), link: Object.assign({ linkKey: f.toPM(A.Link) }, opts.link), lists: Object.assign({ ulKey: f.toPM(A.BulletList), olKey: f.toPM(A.OrderedList), ulInputRules: { plus: false } }, opts.lists), image: {
|
|
36
36
|
parseInsertedUrlAsImage: (_a = opts.imgSize) === null || _a === void 0 ? void 0 : _a.parseInsertedUrlAsImage,
|
|
37
37
|
} });
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import type { PresetName } from 'markdown-it';
|
|
2
2
|
import type { CommonEditor, MarkupString } from '../common';
|
|
3
|
+
import { TransformFn } from './markdown/ProseMirrorTransformer';
|
|
3
4
|
import type { ActionStorage } from './types/actions';
|
|
4
5
|
import type { Extension } from './types/extension';
|
|
5
6
|
import type { Parser } from './types/parser';
|
|
@@ -18,6 +19,7 @@ export declare type WysiwygEditorOptions = {
|
|
|
18
19
|
mdPreset?: PresetName;
|
|
19
20
|
allowHTML?: boolean;
|
|
20
21
|
linkify?: boolean;
|
|
22
|
+
pmTransformers?: TransformFn[];
|
|
21
23
|
linkifyTlds?: string | string[];
|
|
22
24
|
escapeConfig?: EscapeConfig;
|
|
23
25
|
/** Call on any state change (move cursor, change selection, etc...) */
|
|
@@ -31,7 +33,7 @@ export declare class WysiwygEditor implements CommonEditor, ActionStorage {
|
|
|
31
33
|
get serializer(): Serializer;
|
|
32
34
|
get parser(): Parser;
|
|
33
35
|
get actions(): WysiwygEditor.Actions;
|
|
34
|
-
constructor({ domElem, initialContent, extensions, allowHTML, mdPreset, linkify, linkifyTlds, escapeConfig, onChange, onDocChange, }: WysiwygEditorOptions);
|
|
36
|
+
constructor({ domElem, initialContent, extensions, allowHTML, mdPreset, linkify, pmTransformers, linkifyTlds, escapeConfig, onChange, onDocChange, }: WysiwygEditorOptions);
|
|
35
37
|
action<T extends keyof WysiwygEditor.Actions>(actionName: T): WysiwygEditor.Actions[T];
|
|
36
38
|
focus(): void;
|
|
37
39
|
hasFocus(): boolean;
|
package/build/esm/core/Editor.js
CHANGED
|
@@ -7,7 +7,7 @@ import { ExtensionsManager } from './ExtensionsManager';
|
|
|
7
7
|
import { bindActions } from './utils/actions';
|
|
8
8
|
import { logTransactionMetrics } from './utils/metrics';
|
|
9
9
|
export class WysiwygEditor {
|
|
10
|
-
constructor({ domElem, initialContent = '', extensions = () => { }, allowHTML, mdPreset, linkify, linkifyTlds, escapeConfig, onChange, onDocChange, }) {
|
|
10
|
+
constructor({ domElem, initialContent = '', extensions = () => { }, allowHTML, mdPreset, linkify, pmTransformers, linkifyTlds, escapeConfig, onChange, onDocChange, }) {
|
|
11
11
|
_WysiwygEditor_view.set(this, void 0);
|
|
12
12
|
_WysiwygEditor_serializer.set(this, void 0);
|
|
13
13
|
_WysiwygEditor_parser.set(this, void 0);
|
|
@@ -18,6 +18,7 @@ export class WysiwygEditor {
|
|
|
18
18
|
// "breaks" option only affects the renderer, but not the parser
|
|
19
19
|
mdOpts: { html: allowHTML, linkify, breaks: true, preset: mdPreset },
|
|
20
20
|
linkifyTlds,
|
|
21
|
+
pmTransformers,
|
|
21
22
|
});
|
|
22
23
|
const state = EditorState.create({
|
|
23
24
|
schema,
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import MarkdownIt, { PresetName } from 'markdown-it';
|
|
2
2
|
import type { Plugin } from 'prosemirror-state';
|
|
3
3
|
import { ActionsManager } from './ActionsManager';
|
|
4
|
+
import { TransformFn } from './markdown/ProseMirrorTransformer';
|
|
4
5
|
import type { ActionSpec } from './types/actions';
|
|
5
6
|
import type { Extension, ExtensionDeps } from './types/extension';
|
|
6
7
|
import type { MarkViewConstructor, NodeViewConstructor } from './types/node-views';
|
|
@@ -13,6 +14,7 @@ declare type ExtensionsManagerOptions = {
|
|
|
13
14
|
preset?: PresetName;
|
|
14
15
|
};
|
|
15
16
|
linkifyTlds?: string | string[];
|
|
17
|
+
pmTransformers?: TransformFn[];
|
|
16
18
|
};
|
|
17
19
|
export declare class ExtensionsManager {
|
|
18
20
|
#private;
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
var _ExtensionsManager_schemaRegistry, _ExtensionsManager_parserRegistry, _ExtensionsManager_serializerRegistry, _ExtensionsManager_nodeViewCreators, _ExtensionsManager_markViewCreators, _ExtensionsManager_mdForMarkup, _ExtensionsManager_mdForText, _ExtensionsManager_extensions, _ExtensionsManager_builder, _ExtensionsManager_spec, _ExtensionsManager_deps, _ExtensionsManager_plugins, _ExtensionsManager_actions, _ExtensionsManager_nodeViews, _ExtensionsManager_markViews;
|
|
1
|
+
var _ExtensionsManager_schemaRegistry, _ExtensionsManager_parserRegistry, _ExtensionsManager_serializerRegistry, _ExtensionsManager_nodeViewCreators, _ExtensionsManager_markViewCreators, _ExtensionsManager_pmTransformers, _ExtensionsManager_mdForMarkup, _ExtensionsManager_mdForText, _ExtensionsManager_extensions, _ExtensionsManager_builder, _ExtensionsManager_spec, _ExtensionsManager_deps, _ExtensionsManager_plugins, _ExtensionsManager_actions, _ExtensionsManager_nodeViews, _ExtensionsManager_markViews;
|
|
2
2
|
import { __classPrivateFieldGet, __classPrivateFieldSet } from "tslib";
|
|
3
3
|
import MarkdownIt from 'markdown-it';
|
|
4
4
|
import { ActionsManager } from './ActionsManager';
|
|
@@ -14,6 +14,7 @@ export class ExtensionsManager {
|
|
|
14
14
|
_ExtensionsManager_serializerRegistry.set(this, new SerializerTokensRegistry());
|
|
15
15
|
_ExtensionsManager_nodeViewCreators.set(this, new Map());
|
|
16
16
|
_ExtensionsManager_markViewCreators.set(this, new Map());
|
|
17
|
+
_ExtensionsManager_pmTransformers.set(this, []);
|
|
17
18
|
_ExtensionsManager_mdForMarkup.set(this, void 0);
|
|
18
19
|
_ExtensionsManager_mdForText.set(this, void 0);
|
|
19
20
|
_ExtensionsManager_extensions.set(this, void 0);
|
|
@@ -48,6 +49,9 @@ export class ExtensionsManager {
|
|
|
48
49
|
__classPrivateFieldGet(this, _ExtensionsManager_mdForMarkup, "f").linkify.tlds(options.linkifyTlds, true);
|
|
49
50
|
__classPrivateFieldGet(this, _ExtensionsManager_mdForText, "f").linkify.tlds(options.linkifyTlds, true);
|
|
50
51
|
}
|
|
52
|
+
if (options.pmTransformers) {
|
|
53
|
+
__classPrivateFieldSet(this, _ExtensionsManager_pmTransformers, options.pmTransformers, "f");
|
|
54
|
+
}
|
|
51
55
|
// TODO: add prefilled context
|
|
52
56
|
__classPrivateFieldSet(this, _ExtensionsManager_builder, new ExtensionBuilder(), "f");
|
|
53
57
|
}
|
|
@@ -77,8 +81,8 @@ export class ExtensionsManager {
|
|
|
77
81
|
__classPrivateFieldSet(this, _ExtensionsManager_deps, {
|
|
78
82
|
schema,
|
|
79
83
|
actions: new ActionsManager(),
|
|
80
|
-
markupParser: __classPrivateFieldGet(this, _ExtensionsManager_parserRegistry, "f").createParser(schema, __classPrivateFieldGet(this, _ExtensionsManager_mdForMarkup, "f")),
|
|
81
|
-
textParser: __classPrivateFieldGet(this, _ExtensionsManager_parserRegistry, "f").createParser(schema, __classPrivateFieldGet(this, _ExtensionsManager_mdForText, "f")),
|
|
84
|
+
markupParser: __classPrivateFieldGet(this, _ExtensionsManager_parserRegistry, "f").createParser(schema, __classPrivateFieldGet(this, _ExtensionsManager_mdForMarkup, "f"), __classPrivateFieldGet(this, _ExtensionsManager_pmTransformers, "f")),
|
|
85
|
+
textParser: __classPrivateFieldGet(this, _ExtensionsManager_parserRegistry, "f").createParser(schema, __classPrivateFieldGet(this, _ExtensionsManager_mdForText, "f"), __classPrivateFieldGet(this, _ExtensionsManager_pmTransformers, "f")),
|
|
82
86
|
serializer: __classPrivateFieldGet(this, _ExtensionsManager_serializerRegistry, "f").createSerializer(),
|
|
83
87
|
}, "f");
|
|
84
88
|
}
|
|
@@ -93,4 +97,4 @@ export class ExtensionsManager {
|
|
|
93
97
|
}
|
|
94
98
|
}
|
|
95
99
|
}
|
|
96
|
-
_ExtensionsManager_schemaRegistry = new WeakMap(), _ExtensionsManager_parserRegistry = new WeakMap(), _ExtensionsManager_serializerRegistry = new WeakMap(), _ExtensionsManager_nodeViewCreators = new WeakMap(), _ExtensionsManager_markViewCreators = new WeakMap(), _ExtensionsManager_mdForMarkup = new WeakMap(), _ExtensionsManager_mdForText = new WeakMap(), _ExtensionsManager_extensions = new WeakMap(), _ExtensionsManager_builder = new WeakMap(), _ExtensionsManager_spec = new WeakMap(), _ExtensionsManager_deps = new WeakMap(), _ExtensionsManager_plugins = new WeakMap(), _ExtensionsManager_actions = new WeakMap(), _ExtensionsManager_nodeViews = new WeakMap(), _ExtensionsManager_markViews = new WeakMap();
|
|
100
|
+
_ExtensionsManager_schemaRegistry = new WeakMap(), _ExtensionsManager_parserRegistry = new WeakMap(), _ExtensionsManager_serializerRegistry = new WeakMap(), _ExtensionsManager_nodeViewCreators = new WeakMap(), _ExtensionsManager_markViewCreators = new WeakMap(), _ExtensionsManager_pmTransformers = new WeakMap(), _ExtensionsManager_mdForMarkup = new WeakMap(), _ExtensionsManager_mdForText = new WeakMap(), _ExtensionsManager_extensions = new WeakMap(), _ExtensionsManager_builder = new WeakMap(), _ExtensionsManager_spec = new WeakMap(), _ExtensionsManager_deps = new WeakMap(), _ExtensionsManager_plugins = new WeakMap(), _ExtensionsManager_actions = new WeakMap(), _ExtensionsManager_nodeViews = new WeakMap(), _ExtensionsManager_markViews = new WeakMap();
|
|
@@ -1,8 +1,9 @@
|
|
|
1
1
|
import type MarkdownIt from 'markdown-it';
|
|
2
2
|
import type { Schema } from 'prosemirror-model';
|
|
3
|
+
import { TransformFn } from './markdown/ProseMirrorTransformer';
|
|
3
4
|
import type { Parser, ParserToken } from './types/parser';
|
|
4
5
|
export declare class ParserTokensRegistry {
|
|
5
6
|
#private;
|
|
6
7
|
addToken(name: string, token: ParserToken): this;
|
|
7
|
-
createParser(schema: Schema, tokenizer: MarkdownIt): Parser;
|
|
8
|
+
createParser(schema: Schema, tokenizer: MarkdownIt, pmTransformers: TransformFn[]): Parser;
|
|
8
9
|
}
|
|
@@ -9,8 +9,8 @@ export class ParserTokensRegistry {
|
|
|
9
9
|
__classPrivateFieldGet(this, _ParserTokensRegistry_tokens, "f")[name] = token;
|
|
10
10
|
return this;
|
|
11
11
|
}
|
|
12
|
-
createParser(schema, tokenizer) {
|
|
13
|
-
return new MarkdownParser(schema, tokenizer, __classPrivateFieldGet(this, _ParserTokensRegistry_tokens, "f"));
|
|
12
|
+
createParser(schema, tokenizer, pmTransformers) {
|
|
13
|
+
return new MarkdownParser(schema, tokenizer, __classPrivateFieldGet(this, _ParserTokensRegistry_tokens, "f"), pmTransformers);
|
|
14
14
|
}
|
|
15
15
|
}
|
|
16
16
|
_ParserTokensRegistry_tokens = new WeakMap();
|
|
@@ -2,6 +2,7 @@ import type { Match } from 'linkify-it';
|
|
|
2
2
|
import type MarkdownIt from 'markdown-it';
|
|
3
3
|
import { Mark, Node, NodeType, Schema } from 'prosemirror-model';
|
|
4
4
|
import type { Parser, ParserToken } from '../types/parser';
|
|
5
|
+
import { TransformFn } from './ProseMirrorTransformer';
|
|
5
6
|
declare type TokenAttrs = {
|
|
6
7
|
[name: string]: unknown;
|
|
7
8
|
};
|
|
@@ -15,7 +16,8 @@ export declare class MarkdownParser implements Parser {
|
|
|
15
16
|
marks: readonly Mark[];
|
|
16
17
|
tokens: Record<string, ParserToken>;
|
|
17
18
|
tokenizer: MarkdownIt;
|
|
18
|
-
|
|
19
|
+
pmTransformers: TransformFn[];
|
|
20
|
+
constructor(schema: Schema, tokenizer: MarkdownIt, tokens: Record<string, ParserToken>, pmTransformers: TransformFn[]);
|
|
19
21
|
validateLink(url: string): boolean;
|
|
20
22
|
normalizeLink(url: string): string;
|
|
21
23
|
normalizeLinkText(url: string): string;
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import { Mark } from 'prosemirror-model';
|
|
2
2
|
import { logger } from '../../logger';
|
|
3
|
+
import { ProseMirrorTransformer } from './ProseMirrorTransformer';
|
|
3
4
|
const openSuffix = '_open';
|
|
4
5
|
const closeSuffix = '_close';
|
|
5
6
|
var TokenType;
|
|
@@ -9,12 +10,13 @@ var TokenType;
|
|
|
9
10
|
TokenType["default"] = "default";
|
|
10
11
|
})(TokenType || (TokenType = {}));
|
|
11
12
|
export class MarkdownParser {
|
|
12
|
-
constructor(schema, tokenizer, tokens) {
|
|
13
|
+
constructor(schema, tokenizer, tokens, pmTransformers) {
|
|
13
14
|
this.stack = [];
|
|
14
15
|
this.schema = schema;
|
|
15
16
|
this.marks = Mark.none;
|
|
16
17
|
this.tokens = tokens;
|
|
17
18
|
this.tokenizer = tokenizer;
|
|
19
|
+
this.pmTransformers = pmTransformers;
|
|
18
20
|
}
|
|
19
21
|
validateLink(url) {
|
|
20
22
|
return this.tokenizer.validateLink(url);
|
|
@@ -47,7 +49,8 @@ export class MarkdownParser {
|
|
|
47
49
|
do {
|
|
48
50
|
doc = this.closeNode();
|
|
49
51
|
} while (this.stack.length);
|
|
50
|
-
|
|
52
|
+
const pmTransformer = new ProseMirrorTransformer(this.pmTransformers);
|
|
53
|
+
return doc ? pmTransformer.transform(doc) : this.schema.topNodeType.createAndFill();
|
|
51
54
|
}
|
|
52
55
|
finally {
|
|
53
56
|
logger.metrics({ component: 'parser', event: 'parse', duration: Date.now() - time });
|
|
@@ -161,7 +161,7 @@ export class MarkdownSerializerState {
|
|
|
161
161
|
const startOfLine = this.atBlank() || this.closed;
|
|
162
162
|
this.write();
|
|
163
163
|
let text = lines[i];
|
|
164
|
-
if (escape !== false)
|
|
164
|
+
if (escape !== false && this.options.escape !== false)
|
|
165
165
|
text = this.esc(text, startOfLine);
|
|
166
166
|
if (this.escapeWhitespace)
|
|
167
167
|
text = this.escWhitespace(text);
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
export const transformEmptyParagraph = (node) => {
|
|
2
|
+
var _a, _b;
|
|
3
|
+
if (node.type !== 'paragraph')
|
|
4
|
+
return;
|
|
5
|
+
if (((_a = node.content) === null || _a === void 0 ? void 0 : _a.length) !== 1)
|
|
6
|
+
return;
|
|
7
|
+
if (((_b = node.content[0]) === null || _b === void 0 ? void 0 : _b.type) !== 'text')
|
|
8
|
+
return;
|
|
9
|
+
if (node.content[0].text === String.fromCharCode(160))
|
|
10
|
+
delete node.content;
|
|
11
|
+
};
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import { TransformFn } from '.';
|
|
2
|
+
declare type GetTransformersProps = {
|
|
3
|
+
emptyRowTransformer?: boolean;
|
|
4
|
+
};
|
|
5
|
+
declare type GetPMTransformersType = (config: GetTransformersProps) => TransformFn[];
|
|
6
|
+
export declare const getPMTransformers: GetPMTransformersType;
|
|
7
|
+
export {};
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
// TODO: add a new method to the ExtensionBuilder
|
|
2
|
+
import { transformEmptyParagraph } from './emptyRowTransformer';
|
|
3
|
+
export const getPMTransformers = ({ emptyRowTransformer }) => {
|
|
4
|
+
const transformers = [];
|
|
5
|
+
if (emptyRowTransformer) {
|
|
6
|
+
transformers.push(transformEmptyParagraph);
|
|
7
|
+
}
|
|
8
|
+
return transformers;
|
|
9
|
+
};
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import { Node } from 'prosemirror-model';
|
|
2
|
+
declare type PMNodeJSON = {
|
|
3
|
+
type: string;
|
|
4
|
+
attrs?: Record<string, any>;
|
|
5
|
+
content?: PMNodeJSON[];
|
|
6
|
+
text?: string;
|
|
7
|
+
};
|
|
8
|
+
export declare type TransformFn = (node: PMNodeJSON) => void;
|
|
9
|
+
export declare class ProseMirrorTransformer {
|
|
10
|
+
private readonly _transformers;
|
|
11
|
+
constructor(fns: TransformFn[]);
|
|
12
|
+
transform(doc: Node): Node;
|
|
13
|
+
transformJSON(node: PMNodeJSON): void;
|
|
14
|
+
}
|
|
15
|
+
export {};
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import { Node } from 'prosemirror-model';
|
|
2
|
+
export class ProseMirrorTransformer {
|
|
3
|
+
constructor(fns) {
|
|
4
|
+
this._transformers = fns;
|
|
5
|
+
}
|
|
6
|
+
transform(doc) {
|
|
7
|
+
const docJSON = doc.toJSON();
|
|
8
|
+
this.transformJSON(docJSON);
|
|
9
|
+
return Node.fromJSON(doc.type.schema, docJSON);
|
|
10
|
+
}
|
|
11
|
+
transformJSON(node) {
|
|
12
|
+
for (const fn of this._transformers) {
|
|
13
|
+
fn(node);
|
|
14
|
+
}
|
|
15
|
+
if (node.content) {
|
|
16
|
+
for (const child of node.content) {
|
|
17
|
+
this.transformJSON(child);
|
|
18
|
+
}
|
|
19
|
+
}
|
|
20
|
+
}
|
|
21
|
+
}
|
|
@@ -8,5 +8,6 @@ export declare enum BaseNode {
|
|
|
8
8
|
export declare const pType: (schema: import("prosemirror-model").Schema<any, any>) => import("prosemirror-model").NodeType;
|
|
9
9
|
export declare type BaseSchemaSpecsOptions = {
|
|
10
10
|
paragraphPlaceholder?: NonNullable<NodeSpec['placeholder']>['content'];
|
|
11
|
+
preserveEmptyRows?: boolean;
|
|
11
12
|
};
|
|
12
13
|
export declare const BaseSchemaSpecs: ExtensionAuto<BaseSchemaSpecsOptions>;
|
|
@@ -42,6 +42,7 @@ export const BaseSchemaSpecs = (builder, opts) => {
|
|
|
42
42
|
0,
|
|
43
43
|
];
|
|
44
44
|
},
|
|
45
|
+
selectable: true,
|
|
45
46
|
placeholder: opts.paragraphPlaceholder
|
|
46
47
|
? {
|
|
47
48
|
content: opts.paragraphPlaceholder,
|
|
@@ -50,9 +51,28 @@ export const BaseSchemaSpecs = (builder, opts) => {
|
|
|
50
51
|
: undefined,
|
|
51
52
|
},
|
|
52
53
|
fromMd: { tokenSpec: { name: BaseNode.Paragraph, type: 'block' } },
|
|
53
|
-
toMd: (state, node) => {
|
|
54
|
-
|
|
55
|
-
|
|
54
|
+
toMd: (state, node, parent) => {
|
|
55
|
+
/*
|
|
56
|
+
An empty line is added only if there is some content in the parent element.
|
|
57
|
+
This is necessary in order to prevent an empty document with empty lines
|
|
58
|
+
*/
|
|
59
|
+
if (opts.preserveEmptyRows && !node.content.size) {
|
|
60
|
+
let isParentEmpty = true;
|
|
61
|
+
for (let index = 0; index < parent.content.childCount; index++) {
|
|
62
|
+
const parentChild = parent.content.child(index);
|
|
63
|
+
if (parentChild.content.size !== 0 ||
|
|
64
|
+
parentChild.type.name !== 'paragraph') {
|
|
65
|
+
isParentEmpty = false;
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
if (!isParentEmpty) {
|
|
69
|
+
state.write(' \n\n');
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
else {
|
|
73
|
+
state.renderInline(node);
|
|
74
|
+
state.closeBlock(node);
|
|
75
|
+
}
|
|
56
76
|
},
|
|
57
77
|
}));
|
|
58
78
|
};
|
|
@@ -71,11 +71,7 @@ const getTopLevelNodesFromSelection = (selection, doc) => {
|
|
|
71
71
|
const { from, to } = selection;
|
|
72
72
|
doc.nodesBetween(from, to, (node, pos) => {
|
|
73
73
|
const withinSelection = from <= pos && pos + node.nodeSize <= to;
|
|
74
|
-
if (node &&
|
|
75
|
-
node.type.name !== 'paragraph' &&
|
|
76
|
-
!node.isText &&
|
|
77
|
-
node.type.spec.selectable &&
|
|
78
|
-
withinSelection) {
|
|
74
|
+
if (node && !node.isText && node.type.spec.selectable !== false && withinSelection) {
|
|
79
75
|
nodes.push({ node, pos });
|
|
80
76
|
return false;
|
|
81
77
|
}
|
|
@@ -16,7 +16,7 @@ export const setCodeBlockType = ({ serializer }) => (state, dispatch) => {
|
|
|
16
16
|
if (!setBlockType(nodeType)(state))
|
|
17
17
|
return false;
|
|
18
18
|
if (dispatch) {
|
|
19
|
-
const markup = serializer.serialize(state.selection.content().content);
|
|
19
|
+
const markup = serializer.serialize(state.selection.content().content, { escape: false });
|
|
20
20
|
dispatch(state.tr.replaceSelectionWith(nodeType.createAndFill({}, markup ? state.schema.text(markup) : null)));
|
|
21
21
|
}
|
|
22
22
|
return true;
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
export declare const i18n: <G extends "remove" | "info" | "
|
|
1
|
+
export declare const i18n: <G extends "remove" | "info" | "tip" | "warning" | "alert", S extends string>(key: G | (string extends S ? S : never), params?: {
|
|
2
2
|
[key: string]: any;
|
|
3
3
|
} | undefined) => S extends G ? {
|
|
4
4
|
info: string;
|
package/build/esm/index.d.ts
CHANGED
package/build/esm/index.js
CHANGED
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import { CompletionContext, CompletionResult } from '@codemirror/autocomplete';
|
|
2
|
+
export declare const emptyRowSnippetTemplate = " \n\n";
|
|
3
|
+
export declare const emptyRowSnippet: (editor: {
|
|
4
|
+
state: import("@codemirror/state").EditorState;
|
|
5
|
+
dispatch: (tr: import("@codemirror/state").Transaction) => void;
|
|
6
|
+
}, completion: import("@codemirror/autocomplete").Completion | null, from: number, to: number) => void;
|
|
7
|
+
export declare const emptyRowAutocomplete: {
|
|
8
|
+
autocomplete: (context: CompletionContext) => CompletionResult | null;
|
|
9
|
+
};
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
import { snippet } from '@codemirror/autocomplete';
|
|
2
|
+
import { i18n } from '../../../../src/i18n/empty-row';
|
|
3
|
+
export const emptyRowSnippetTemplate = ' \n\n';
|
|
4
|
+
export const emptyRowSnippet = snippet(emptyRowSnippetTemplate);
|
|
5
|
+
export const emptyRowAutocomplete = {
|
|
6
|
+
autocomplete: (context) => {
|
|
7
|
+
const word = context.matchBefore(/^.*/);
|
|
8
|
+
if (word === null || word === void 0 ? void 0 : word.text.startsWith('&')) {
|
|
9
|
+
return {
|
|
10
|
+
from: word.from,
|
|
11
|
+
options: [
|
|
12
|
+
{
|
|
13
|
+
label: ' ',
|
|
14
|
+
displayLabel: i18n('snippet.text'),
|
|
15
|
+
type: 'text',
|
|
16
|
+
apply: emptyRowSnippet,
|
|
17
|
+
},
|
|
18
|
+
],
|
|
19
|
+
};
|
|
20
|
+
}
|
|
21
|
+
return null;
|
|
22
|
+
},
|
|
23
|
+
};
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import { mdAutocomplete } from '../yfm';
|
|
2
|
+
import { emptyRowAutocomplete } from './emptyRow';
|
|
3
|
+
export const getAutocompleteConfig = ({ preserveEmptyRows }) => {
|
|
4
|
+
const autocompleteItems = [];
|
|
5
|
+
if (preserveEmptyRows) {
|
|
6
|
+
autocompleteItems.push(emptyRowAutocomplete);
|
|
7
|
+
}
|
|
8
|
+
autocompleteItems.push(mdAutocomplete);
|
|
9
|
+
return autocompleteItems;
|
|
10
|
+
};
|
|
@@ -33,6 +33,7 @@ export declare type CreateCodemirrorParams = {
|
|
|
33
33
|
yfmLangOptions?: YfmLangOptions;
|
|
34
34
|
autocompletion?: Autocompletion;
|
|
35
35
|
directiveSyntax: DirectiveSyntaxContext;
|
|
36
|
+
preserveEmptyRows: boolean;
|
|
36
37
|
};
|
|
37
38
|
export declare function createCodemirror(params: CreateCodemirrorParams): EditorView;
|
|
38
39
|
export declare function withLogger(action: string, command: StateCommand): StateCommand;
|
|
@@ -6,7 +6,7 @@ import { ActionName } from '../../bundle/config/action-names';
|
|
|
6
6
|
import { logger } from '../../logger';
|
|
7
7
|
import { Action as A, formatter as f } from '../../shortcuts';
|
|
8
8
|
import { DataTransferType, shouldSkipHtmlConversion } from '../../utils/clipboard';
|
|
9
|
-
import { insertImages, insertLink, toH1, toH2, toH3, toH4, toH5, toH6, toggleBold, toggleItalic, toggleStrikethrough, toggleUnderline, wrapToCodeBlock, wrapToInlineCode, wrapToYfmCut, wrapToYfmNote, } from '../commands';
|
|
9
|
+
import { insertEmptyRow, insertImages, insertLink, toH1, toH2, toH3, toH4, toH5, toH6, toggleBold, toggleItalic, toggleStrikethrough, toggleUnderline, wrapToCodeBlock, wrapToInlineCode, wrapToYfmCut, wrapToYfmNote, } from '../commands';
|
|
10
10
|
import { DirectiveSyntaxFacet } from './directive-facet';
|
|
11
11
|
import { FileUploadHandlerFacet } from './files-upload-facet';
|
|
12
12
|
import { gravityHighlightStyle, gravityTheme } from './gravity';
|
|
@@ -17,7 +17,7 @@ import { SearchPanelPlugin } from './search-plugin/plugin';
|
|
|
17
17
|
import { smartReindent } from './smart-reindent';
|
|
18
18
|
import { yfmLang } from './yfm';
|
|
19
19
|
export function createCodemirror(params) {
|
|
20
|
-
const { doc, reactRenderer, onCancel, onScroll, onSubmit, onChange, onDocChange, disabledExtensions = {}, keymaps = [], receiver, yfmLangOptions, extensions: extraExtensions, placeholder: placeholderContent, autocompletion: autocompletionConfig, parseHtmlOnPaste, parseInsertedUrlAsImage, directiveSyntax, } = params;
|
|
20
|
+
const { doc, reactRenderer, onCancel, onScroll, onSubmit, onChange, onDocChange, disabledExtensions = {}, keymaps = [], receiver, yfmLangOptions, extensions: extraExtensions, placeholder: placeholderContent, autocompletion: autocompletionConfig, parseHtmlOnPaste, parseInsertedUrlAsImage, directiveSyntax, preserveEmptyRows, } = params;
|
|
21
21
|
const extensions = [gravityTheme, placeholder(placeholderContent)];
|
|
22
22
|
if (!disabledExtensions.history) {
|
|
23
23
|
extensions.push(history());
|
|
@@ -136,6 +136,11 @@ export function createCodemirror(params) {
|
|
|
136
136
|
anchorSelector: '.g-md-search-anchor',
|
|
137
137
|
receiver,
|
|
138
138
|
}));
|
|
139
|
+
if (preserveEmptyRows) {
|
|
140
|
+
extensions.push(keymap.of([
|
|
141
|
+
{ key: f.toCM(A.EmptyRow), run: withLogger(ActionName.emptyRow, insertEmptyRow) },
|
|
142
|
+
]));
|
|
143
|
+
}
|
|
139
144
|
if (params.uploadHandler) {
|
|
140
145
|
extensions.push(FileUploadHandlerFacet.of({
|
|
141
146
|
fn: params.uploadHandler,
|
|
@@ -8,7 +8,7 @@ export declare const customTags: {
|
|
|
8
8
|
};
|
|
9
9
|
export declare type YfmNoteType = 'info' | 'tip' | 'warning' | 'alert';
|
|
10
10
|
export declare const yfmNoteTypes: readonly YfmNoteType[];
|
|
11
|
-
export declare const yfmNoteSnippetTemplate: (type: YfmNoteType) => "{% note info %}\n\n#{}\n\n{% endnote %}\n\n" | "{% note
|
|
11
|
+
export declare const yfmNoteSnippetTemplate: (type: YfmNoteType) => "{% note info %}\n\n#{}\n\n{% endnote %}\n\n" | "{% note tip %}\n\n#{}\n\n{% endnote %}\n\n" | "{% note warning %}\n\n#{}\n\n{% endnote %}\n\n" | "{% note alert %}\n\n#{}\n\n{% endnote %}\n\n";
|
|
12
12
|
export declare const yfmNoteSnippets: Record<YfmNoteType, ReturnType<typeof snippet>>;
|
|
13
13
|
export declare const yfmCutSnippetTemplate = "{% cut \"#{title}\" %}\n\n#{}\n\n{% endcut %}\n\n";
|
|
14
14
|
export declare const yfmCutSnippet: (editor: {
|
|
@@ -27,4 +27,5 @@ export interface LanguageData {
|
|
|
27
27
|
export interface YfmLangOptions {
|
|
28
28
|
languageData?: LanguageData[];
|
|
29
29
|
}
|
|
30
|
+
export declare const mdAutocomplete: LanguageData;
|
|
30
31
|
export declare function yfmLang({ languageData }?: YfmLangOptions): Extension;
|
|
@@ -57,7 +57,7 @@ export const yfmCutSnippetTemplate = '{% cut "#{title}" %}\n\n#{}\n\n{% endcut %
|
|
|
57
57
|
export const yfmCutSnippet = snippet(yfmCutSnippetTemplate);
|
|
58
58
|
export const yfmCutDirectiveSnippetTemplate = ':::cut [#{title}]\n#{}\n:::\n\n';
|
|
59
59
|
export const yfmCutDirectiveSnippet = snippet(yfmCutDirectiveSnippetTemplate);
|
|
60
|
-
const mdAutocomplete = {
|
|
60
|
+
export const mdAutocomplete = {
|
|
61
61
|
autocomplete: (context) => {
|
|
62
62
|
const directiveContext = context.state.facet(DirectiveSyntaxFacet);
|
|
63
63
|
// TODO: add more actions and re-enable
|