diff --git a/packages/core/src/commands/extendMarkRange.ts b/packages/core/src/commands/extendMarkRange.ts new file mode 100644 index 00000000..1b2708a0 --- /dev/null +++ b/packages/core/src/commands/extendMarkRange.ts @@ -0,0 +1,23 @@ +import { TextSelection } from 'prosemirror-state' +import { MarkType } from 'prosemirror-model' +import { Command } from '../Editor' +import getMarkType from '../utils/getMarkType' +import getMarkRange from '../utils/getMarkRange' + +export default (typeOrName: string | MarkType): Command => ({ tr, state, dispatch }) => { + const type = getMarkType(typeOrName, state.schema) + const { doc, selection } = tr + const { $from, empty } = selection + + if (empty && dispatch) { + const range = getMarkRange($from, type) + + if (range) { + const newSelection = TextSelection.create(doc, range.from, range.to) + + tr.setSelection(newSelection) + } + } + + return true +} diff --git a/packages/core/src/extensions/commands.ts b/packages/core/src/extensions/commands.ts index 4b945ac3..9991a88e 100644 --- a/packages/core/src/extensions/commands.ts +++ b/packages/core/src/extensions/commands.ts @@ -3,6 +3,7 @@ import blur from '../commands/blur' import clearContent from '../commands/clearContent' import clearNodes from '../commands/clearNodes' import deleteSelection from '../commands/deleteSelection' +import extendMarkRange from '../commands/extendMarkRange' import focus from '../commands/focus' import insertHTML from '../commands/insertHTML' import insertText from '../commands/insertText' @@ -34,6 +35,7 @@ export const Commands = createExtension({ clearContent, clearNodes, deleteSelection, + extendMarkRange, focus, insertHTML, insertText,