|
1 | 1 | import {setBlockType} from 'prosemirror-commands'; |
2 | 2 | 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'; |
5 | 5 | import {hasParentNodeOfType} from 'prosemirror-utils'; |
6 | 6 | import type {Action, ExtensionAuto, Keymap} from '../../../core'; |
7 | 7 | import {resetCodeblock} from './commands'; |
@@ -82,10 +82,23 @@ export const CodeBlock: ExtensionAuto<CodeBlockOptions> = (builder, opts) => { |
82 | 82 | }); |
83 | 83 |
|
84 | 84 | builder.addInputRules(({schema}) => ({rules: [codeBlockRule(cbType(schema))]})); |
85 | | - |
86 | | - builder.addAction(cbAction, ({schema}) => { |
| 85 | + builder.addAction(cbAction, ({schema, serializer}) => { |
87 | 86 | 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 | + |
89 | 102 | return { |
90 | 103 | isActive: (state) => hasParentNodeOfType(cb)(state.selection), |
91 | 104 | isEnable: cmd, |
|
0 commit comments