diff --git a/packages/core/src/commands/lift.ts b/packages/core/src/commands/lift.ts index dfea4a4a..53f7960e 100644 --- a/packages/core/src/commands/lift.ts +++ b/packages/core/src/commands/lift.ts @@ -1,7 +1,7 @@ import { lift as originalLift } from 'prosemirror-commands' import { NodeType } from 'prosemirror-model' import { Command } from '../types' -import nodeIsActive from '../helpers/nodeIsActive' +import isNodeActive from '../helpers/isNodeActive' import getNodeType from '../helpers/getNodeType' /** @@ -9,7 +9,7 @@ import getNodeType from '../helpers/getNodeType' */ export const lift = (typeOrName: string | NodeType, attributes = {}): Command => ({ state, dispatch }) => { const type = getNodeType(typeOrName, state.schema) - const isActive = nodeIsActive(state, type, attributes) + const isActive = isNodeActive(state, type, attributes) if (!isActive) { return false diff --git a/packages/core/src/commands/toggleMark.ts b/packages/core/src/commands/toggleMark.ts index 39de0dcf..9a1922de 100644 --- a/packages/core/src/commands/toggleMark.ts +++ b/packages/core/src/commands/toggleMark.ts @@ -1,14 +1,14 @@ import { MarkType } from 'prosemirror-model' import { Command } from '../types' import getMarkType from '../helpers/getMarkType' -import markIsActive from '../helpers/markIsActive' +import isMarkActive from '../helpers/isMarkActive' /** * Toggle a mark on and off. */ export const toggleMark = (typeOrName: string | MarkType, attributes?: {}): Command => ({ state, commands }) => { const type = getMarkType(typeOrName, state.schema) - const isActive = markIsActive(state, type, attributes) + const isActive = isMarkActive(state, type, attributes) if (isActive) { return commands.unsetMark(type) diff --git a/packages/core/src/commands/toggleNode.ts b/packages/core/src/commands/toggleNode.ts index 067f0e81..6f880855 100644 --- a/packages/core/src/commands/toggleNode.ts +++ b/packages/core/src/commands/toggleNode.ts @@ -1,6 +1,6 @@ import { NodeType } from 'prosemirror-model' import { Command } from '../types' -import nodeIsActive from '../helpers/nodeIsActive' +import isNodeActive from '../helpers/isNodeActive' import getNodeType from '../helpers/getNodeType' /** @@ -9,7 +9,7 @@ import getNodeType from '../helpers/getNodeType' export const toggleNode = (typeOrName: string | NodeType, toggleTypeOrName: string | NodeType, attrs = {}): Command => ({ state, commands }) => { const type = getNodeType(typeOrName, state.schema) const toggleType = getNodeType(toggleTypeOrName, state.schema) - const isActive = nodeIsActive(state, type, attrs) + const isActive = isNodeActive(state, type, attrs) if (isActive) { return commands.setNode(toggleType) diff --git a/packages/core/src/commands/toggleWrap.ts b/packages/core/src/commands/toggleWrap.ts index 9e9709dc..c70cdf05 100644 --- a/packages/core/src/commands/toggleWrap.ts +++ b/packages/core/src/commands/toggleWrap.ts @@ -1,7 +1,7 @@ import { wrapIn, lift } from 'prosemirror-commands' import { NodeType } from 'prosemirror-model' import { Command } from '../types' -import nodeIsActive from '../helpers/nodeIsActive' +import isNodeActive from '../helpers/isNodeActive' import getNodeType from '../helpers/getNodeType' /** @@ -9,7 +9,7 @@ import getNodeType from '../helpers/getNodeType' */ export const toggleWrap = (typeOrName: string | NodeType, attributes = {}): Command => ({ state, dispatch }) => { const type = getNodeType(typeOrName, state.schema) - const isActive = nodeIsActive(state, type, attributes) + const isActive = isNodeActive(state, type, attributes) if (isActive) { return lift(state, dispatch) diff --git a/packages/core/src/commands/wrapIn.ts b/packages/core/src/commands/wrapIn.ts index 5bc85b48..bcf89da1 100644 --- a/packages/core/src/commands/wrapIn.ts +++ b/packages/core/src/commands/wrapIn.ts @@ -1,7 +1,7 @@ import { wrapIn as originalWrapIn } from 'prosemirror-commands' import { NodeType } from 'prosemirror-model' import { Command } from '../types' -import nodeIsActive from '../helpers/nodeIsActive' +import isNodeActive from '../helpers/isNodeActive' import getNodeType from '../helpers/getNodeType' /** @@ -9,7 +9,7 @@ import getNodeType from '../helpers/getNodeType' */ export const wrapIn = (typeOrName: string | NodeType, attributes = {}): Command => ({ state, dispatch }) => { const type = getNodeType(typeOrName, state.schema) - const isActive = nodeIsActive(state, type, attributes) + const isActive = isNodeActive(state, type, attributes) if (isActive) { return false diff --git a/packages/core/src/helpers/isActive.ts b/packages/core/src/helpers/isActive.ts index 1f9f637b..3e6e40f7 100644 --- a/packages/core/src/helpers/isActive.ts +++ b/packages/core/src/helpers/isActive.ts @@ -1,20 +1,22 @@ import { EditorState } from 'prosemirror-state' -import nodeIsActive from './nodeIsActive' -import markIsActive from './markIsActive' +import isNodeActive from './isNodeActive' +import isMarkActive from './isMarkActive' import getSchemaTypeNameByName from './getSchemaTypeNameByName' export default function isActive(state: EditorState, name: string | null, attributes: { [key: string ]: any } = {}): boolean { - if (name) { - const schemaType = getSchemaTypeNameByName(name, state.schema) - - if (schemaType === 'node') { - return nodeIsActive(state, state.schema.nodes[name], attributes) - } if (schemaType === 'mark') { - return markIsActive(state, state.schema.marks[name], attributes) - } - - return false + if (!name) { + return isNodeActive(state, null, attributes) || isMarkActive(state, null, attributes) } - return nodeIsActive(state, null, attributes) || markIsActive(state, null, attributes) + const schemaType = getSchemaTypeNameByName(name, state.schema) + + if (schemaType === 'node') { + return isNodeActive(state, name, attributes) + } + + if (schemaType === 'mark') { + return isMarkActive(state, name, attributes) + } + + return false } diff --git a/packages/core/src/helpers/markIsActive.ts b/packages/core/src/helpers/isMarkActive.ts similarity index 85% rename from packages/core/src/helpers/markIsActive.ts rename to packages/core/src/helpers/isMarkActive.ts index 9e9317ad..7d0729f3 100644 --- a/packages/core/src/helpers/markIsActive.ts +++ b/packages/core/src/helpers/isMarkActive.ts @@ -1,15 +1,19 @@ import { EditorState } from 'prosemirror-state' import { Mark, MarkType } from 'prosemirror-model' import objectIncludes from '../utilities/objectIncludes' -import getMarkType from '../helpers/getMarkType' +import getMarkType from './getMarkType' -type MarkRange = { +export type MarkRange = { mark: Mark, from: number, to: number, } -export default function markIsActive(state: EditorState, typeOrName: MarkType | string | null, attributes = {}) { +export default function isMarkActive( + state: EditorState, + typeOrName: MarkType | string | null, + attributes = {}, +): boolean { const { from, to, empty } = state.selection const type = typeOrName ? getMarkType(typeOrName, state.schema) @@ -60,5 +64,5 @@ export default function markIsActive(state: EditorState, typeOrName: MarkType | return sum + size }, 0) - return selectionRange <= range + return selectionRange === range } diff --git a/packages/core/src/helpers/nodeIsActive.ts b/packages/core/src/helpers/isNodeActive.ts similarity index 85% rename from packages/core/src/helpers/nodeIsActive.ts rename to packages/core/src/helpers/isNodeActive.ts index 711cceac..772ad47e 100644 --- a/packages/core/src/helpers/nodeIsActive.ts +++ b/packages/core/src/helpers/isNodeActive.ts @@ -1,15 +1,19 @@ import { EditorState } from 'prosemirror-state' import { Node, NodeType } from 'prosemirror-model' import objectIncludes from '../utilities/objectIncludes' -import getNodeType from '../helpers/getNodeType' +import getNodeType from './getNodeType' -type NodeRange = { +export type NodeRange = { node: Node, from: number, to: number, } -export default function nodeIsActive(state: EditorState, typeOrName: NodeType | string | null, attributes = {}) { +export default function isNodeActive( + state: EditorState, + typeOrName: NodeType | string | null, + attributes = {}, +): boolean { const { from, to, empty } = state.selection const type = typeOrName ? getNodeType(typeOrName, state.schema) @@ -42,6 +46,8 @@ export default function nodeIsActive(state: EditorState, typeOrName: NodeType | .find(nodeRange => objectIncludes(nodeRange.node.attrs, attributes)) } + const selectionRange = to - from + const range = nodeRanges .filter(nodeRange => { if (!type) { @@ -56,7 +62,5 @@ export default function nodeIsActive(state: EditorState, typeOrName: NodeType | return sum + size }, 0) - const selectionRange = to - from - - return selectionRange <= range + return selectionRange === range }