diff --git a/packages/core/src/NodeExtension.ts b/packages/core/src/NodeExtension.ts index 37e6f2fc..cfb304d9 100644 --- a/packages/core/src/NodeExtension.ts +++ b/packages/core/src/NodeExtension.ts @@ -12,6 +12,11 @@ export interface NodeExtensionSpec extends Overwrit */ topNode?: boolean, + /** + * List + */ + list?: boolean, + /** * Content */ @@ -158,6 +163,7 @@ const defaultNode: NodeExtension = { type: 'node', name: 'node', topNode: false, + list: false, content: null, marks: null, group: null, diff --git a/packages/core/src/extensions/toggleList.ts b/packages/core/src/extensions/toggleList.ts index 26f97ea5..a0bc3288 100644 --- a/packages/core/src/extensions/toggleList.ts +++ b/packages/core/src/extensions/toggleList.ts @@ -1,23 +1,19 @@ import { wrapInList, liftListItem } from 'prosemirror-schema-list' import { findParentNode } from 'prosemirror-utils' -import { Node, NodeType, Schema } from 'prosemirror-model' +import { NodeType } from 'prosemirror-model' import { Command } from '../Editor' import { createExtension } from '../Extension' import getNodeType from '../utils/getNodeType' - -function isList(node: Node, schema: Schema) { - return (node.type === schema.nodes.bullet_list - || node.type === schema.nodes.ordered_list - || node.type === schema.nodes.task_list) -} +import isList from '../utils/isList' export const ToggleList = createExtension({ addCommands() { return { toggleList: (listTypeOrName: string | NodeType, itemTypeOrName: string | NodeType): Command => ({ tr, state, dispatch }) => { + const { extensions } = this.editor.options const listType = getNodeType(listTypeOrName, state.schema) const itemType = getNodeType(itemTypeOrName, state.schema) - const { schema, selection } = state + const { selection } = state const { $from, $to } = selection const range = $from.blockRange($to) @@ -25,14 +21,14 @@ export const ToggleList = createExtension({ return false } - const parentList = findParentNode(node => isList(node, schema))(selection) + const parentList = findParentNode(node => isList(node.type.name, extensions))(selection) if (range.depth >= 1 && parentList && range.depth - parentList.depth <= 1) { if (parentList.node.type === listType) { return liftListItem(itemType)(state, dispatch) } - if (isList(parentList.node, schema) && listType.validContent(parentList.node.content)) { + if (isList(parentList.node.type.name, extensions) && listType.validContent(parentList.node.content)) { tr.setNodeMarkup(parentList.pos, listType) return false diff --git a/packages/core/src/utils/isList.ts b/packages/core/src/utils/isList.ts new file mode 100644 index 00000000..3a5a2305 --- /dev/null +++ b/packages/core/src/utils/isList.ts @@ -0,0 +1,13 @@ +import { Extensions } from '../types' +import splitExtensions from './splitExtensions' + +export default function isList(name: string, extensions: Extensions) { + const { nodeExtensions } = splitExtensions(extensions) + const extension = nodeExtensions.find(item => item.name === name) + + if (!extension) { + return false + } + + return extension.list +} diff --git a/packages/extension-bullet-list/index.ts b/packages/extension-bullet-list/index.ts index cb949d70..d4d57246 100644 --- a/packages/extension-bullet-list/index.ts +++ b/packages/extension-bullet-list/index.ts @@ -4,6 +4,8 @@ import { wrappingInputRule } from 'prosemirror-inputrules' const BulletList = createNode({ name: 'bullet_list', + list: true, + group: 'block', content: 'list_item+', diff --git a/packages/extension-ordered-list/index.ts b/packages/extension-ordered-list/index.ts index 6c0aef3b..3255ad56 100644 --- a/packages/extension-ordered-list/index.ts +++ b/packages/extension-ordered-list/index.ts @@ -4,6 +4,8 @@ import { wrappingInputRule } from 'prosemirror-inputrules' const OrderedList = createNode({ name: 'ordered_list', + list: true, + group: 'block', content: 'list_item+', diff --git a/packages/extension-task-list/index.ts b/packages/extension-task-list/index.ts index 76a61da6..28f5a3d1 100644 --- a/packages/extension-task-list/index.ts +++ b/packages/extension-task-list/index.ts @@ -4,6 +4,8 @@ import { wrappingInputRule } from 'prosemirror-inputrules' const TaskList = createNode({ name: 'task_list', + list: true, + group: 'block', content: 'task_item+',