diff --git a/docs/src/docPages/api/commands.md b/docs/src/docPages/api/commands.md index fcbb5fab..a8103d8b 100644 --- a/docs/src/docPages/api/commands.md +++ b/docs/src/docPages/api/commands.md @@ -166,6 +166,7 @@ Have a look at all of the core commands listed below. They should give you a goo | ----------------------- | --------------------------------------------------------- | ------------------------------------ | | .clearNodes() | Normalize nodes to a simple paragraph. | [More](/api/commands/clear-nodes) | | .createParagraphNear() | Create a paragraph nearby. | [More](/api/commands/create-paragraph-near) | +| .deleteNode() | Delete a node. | [More](/api/commands/delete-node) | | .extendMarkRange() | Extends the text selection to the current mark. | [More](/api/commands/extend-mark-range) | | .exitCode() | Exit from a code block. | [More](/api/commands/exit-code) | | .joinBackward() | Join two nodes backward. | [More](/api/commands/join-backward) | diff --git a/docs/src/docPages/api/commands/delete-node.md b/docs/src/docPages/api/commands/delete-node.md new file mode 100644 index 00000000..42c7357b --- /dev/null +++ b/docs/src/docPages/api/commands/delete-node.md @@ -0,0 +1,3 @@ +# deleteNode + + diff --git a/docs/src/links.yaml b/docs/src/links.yaml index 9bcb0e7b..8d507417 100644 --- a/docs/src/links.yaml +++ b/docs/src/links.yaml @@ -140,6 +140,9 @@ - title: createParagraphNear link: /api/commands/create-paragraph-near type: draft + - title: deleteNode + link: /api/commands/delete-node + type: draft - title: deleteRange link: /api/commands/delete-range type: draft diff --git a/packages/core/src/commands/deleteNode.ts b/packages/core/src/commands/deleteNode.ts new file mode 100644 index 00000000..447134a7 --- /dev/null +++ b/packages/core/src/commands/deleteNode.ts @@ -0,0 +1,36 @@ +import { NodeType } from 'prosemirror-model' +import getNodeType from '../helpers/getNodeType' +import { RawCommands } from '../types' + +declare module '@tiptap/core' { + interface Commands { + deleteNode: { + /** + * Delete a node. + */ + deleteNode: (typeOrName: string | NodeType) => ReturnType, + } + } +} + +export const deleteNode: RawCommands['deleteNode'] = typeOrName => ({ tr, state, dispatch }) => { + const type = getNodeType(typeOrName, state.schema) + const $pos = tr.selection.$anchor + + for (let depth = $pos.depth; depth > 0; depth -= 1) { + const node = $pos.node(depth) + + if (node.type === type) { + if (dispatch) { + const from = $pos.before(depth) + const to = $pos.after(depth) + + tr.delete(from, to).scrollIntoView() + } + + return true + } + } + + return false +} diff --git a/packages/core/src/extensions/commands.ts b/packages/core/src/extensions/commands.ts index 4c06b154..889dc44b 100644 --- a/packages/core/src/extensions/commands.ts +++ b/packages/core/src/extensions/commands.ts @@ -4,6 +4,7 @@ import * as clearContent from '../commands/clearContent' import * as clearNodes from '../commands/clearNodes' import * as command from '../commands/command' import * as createParagraphNear from '../commands/createParagraphNear' +import * as deleteNode from '../commands/deleteNode' import * as deleteRange from '../commands/deleteRange' import * as deleteSelection from '../commands/deleteSelection' import * as enter from '../commands/enter' @@ -54,6 +55,7 @@ export { clearContent } export { clearNodes } export { command } export { createParagraphNear } +export { deleteNode } export { deleteRange } export { deleteSelection } export { enter } @@ -109,6 +111,7 @@ export const Commands = Extension.create({ ...clearNodes, ...command, ...createParagraphNear, + ...deleteNode, ...deleteRange, ...deleteSelection, ...enter,