Skip to content

Commit c170560

Browse files
authored
feat: serialization of selection content when creating codeblock (#67)
1 parent fcbf4da commit c170560

File tree

1 file changed

+18
-5
lines changed
  • src/extensions/markdown/CodeBlock

1 file changed

+18
-5
lines changed

src/extensions/markdown/CodeBlock/index.ts

Lines changed: 18 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
import {setBlockType} from 'prosemirror-commands';
22
import {textblockTypeInputRule} from 'prosemirror-inputrules';
3-
import {NodeType, Slice} from 'prosemirror-model';
4-
import {Plugin} from 'prosemirror-state';
3+
import {Fragment, NodeType, Slice} from 'prosemirror-model';
4+
import {Command, Plugin} from 'prosemirror-state';
55
import {hasParentNodeOfType} from 'prosemirror-utils';
66
import type {Action, ExtensionAuto, Keymap} from '../../../core';
77
import {resetCodeblock} from './commands';
@@ -82,10 +82,23 @@ export const CodeBlock: ExtensionAuto<CodeBlockOptions> = (builder, opts) => {
8282
});
8383

8484
builder.addInputRules(({schema}) => ({rules: [codeBlockRule(cbType(schema))]}));
85-
86-
builder.addAction(cbAction, ({schema}) => {
85+
builder.addAction(cbAction, ({schema, serializer}) => {
8786
const cb = cbType(schema);
88-
const cmd = setBlockType(cb);
87+
const cmd: Command = (state, dispatch) => {
88+
if (!setBlockType(cb)(state)) return false;
89+
if (dispatch) {
90+
const markup = serializer.serialize(
91+
Fragment.from(state.selection.content().content),
92+
);
93+
dispatch(
94+
state.tr.replaceSelectionWith(
95+
cb.createAndFill({}, markup ? state.schema.text(markup) : null)!,
96+
),
97+
);
98+
}
99+
return true;
100+
};
101+
89102
return {
90103
isActive: (state) => hasParentNodeOfType(cb)(state.selection),
91104
isEnable: cmd,

0 commit comments

Comments
 (0)