A collection of utility functions to enhance your workflow with the Tiptap editor.
npm install tiptap-utility
- isTextSelected
- getWordCount
- getFocusedNodeContainer
- getAllNodesOfType
- getAllNodesByTypeAndAttrs
- findParentNodeOfTypeAtPosition
- getEditorState
- getNodesInRange
- getLastChildNode
- getNextSiblingNode
Checks if text is selected in the Tiptap editor.
-
editor
: TiptapEditor
instance.
-
boolean
:true
if text is selected and editor is editable, otherwisefalse
.
import { isTextSelected } from 'tiptap-utility';
const isSelected = isTextSelected({ editor });
console.log(isSelected ? "Text is selected" : "No text selected");
Counts the number of words in the Tiptap editor content.
-
editor
: TiptapEditor
instance.
-
number
: Total word count.
import { getWordCount } from 'tiptap-utility';
const wordCount = getWordCount(editor);
console.log(`Word count: ${wordCount}`);
Finds the focused node container in the Tiptap editor DOM based on the specified nodeType
.
-
editor
: TiptapEditor
instance. -
nodeType
: The target node type to locate. -
attribute
(optional): Attribute used to identify the node. Default is'data-type'
. -
focusClass
(optional): CSS class used to identify focused nodes. Default is'has-focus'
.
-
HTMLElement | null
: The focused node container ornull
if not found.
import { getFocusedNodeContainer } from 'tiptap-utility';
const container = getFocusedNodeContainer(editor, 'paragraph');
if (container) {
console.log('Focused node container:', container);
} else {
console.log('No focused container found.');
}
Retrieves all nodes of a specified type from the Tiptap editor document, including those nested within lists, tables, or other container nodes.
-
editor
: TiptapEditor
instance. -
type
: The target node type to locate (e.g.,'heading'
,'paragraph'
).
-
Array<{ node: Node, pos: number }>
:- An array of objects where each object contains:
-
node
: The node instance of the specified type. -
pos
: The position of the node in the document.
-
- An array of objects where each object contains:
import { getAllNodesOfType } from 'tiptap-utility';
const headings = getAllNodesOfType(editor, 'heading');
headings.forEach(({ node, pos }) => {
console.log('Found heading:', node, 'at position:', pos);
});
Finds all nodes of a given type and with specific attributes in the Tiptap editor's document.
-
editor
: TiptapEditor
instance. -
type
: A string representing the type of node to search for. -
attrs
: An object containing the attributes to match against the nodes.
-
Array<{ node: any; pos: number }>
: An array of nodes and their positions that match the given type and attributes.
import { getAllNodesByTypeAndAttrs } from 'tiptap-utility';
const nodes = getAllNodesByTypeAndAttrs({ editor }, 'image', { src: 'https://example.com/image.jpg' });
console.log(nodes);
Finds the parent node of a given type at a specific position in the Tiptap editor.
-
editor
: TiptapEditor
instance. -
position
: The position in the document where the search for the parent node begins. -
parentNodeTypeName
: The name of the parent node type to search for.
-
{ node: any; depth: number; start: number; end: number } | null
: An object containing the parent node, its depth, and its start and end positions if found, otherwisenull
.
import { findParentNodeOfTypeAtPosition } from 'tiptap-utility';
const parentNode = findParentNodeOfTypeAtPosition({ editor }, 10, 'paragraph');
if (parentNode) {
console.log('Parent node found:', parentNode);
} else {
console.log('No parent node found at the specified position');
}
Retrieves the current state of the Tiptap editor.
-
editor
: TiptapEditor
instance.
-
object
: The current state of the editor, either fromeditor.state
oreditor.view.state
.
import { getEditorState } from 'tiptap-utility';
const editorState = getEditorState({ editor });
console.log(editorState);
Extracts all nodes within a specified range in the Tiptap editor document. Optionally, it can filter nodes by specified types.
-
editor
(required): An instance of the TiptapEditor
. -
from
(required): The starting position of the range (inclusive). -
to
(required): The ending position of the range (exclusive). -
nodeType
(optional): An array of node type names to filter for, ornull
to include all node types. Defaults tonull
.
-
NodeWithPosition[]
: An array of objects, where each object contains:-
node
: The ProseMirrorNode
instance. -
pos
: The starting position of the node within the document.
-
import { getNodesInRange } from 'tiptap-utility';
const from = 0;
const to = 50;
const nodeTypes = ['paragraph', 'heading'];
const nodes = getNodesInRange(editor, from, to, nodeTypes);
nodes.forEach(({ node, pos }) => {
console.log(`Node of type ${node.type.name} found at position ${pos}`);
});
Retrieves the last child node of a given node along with its starting position.
-
node
(required): A ProseMirrorNode
from which to find the last child.
-
{ node: Node, pos: number } | null
:- If the node has child nodes, returns an object containing:
-
node
: The last childNode
. -
pos
: The starting position of the last child node.
-
- Returns
null
if the node has no children.
- If the node has child nodes, returns an object containing:
import { getLastChildNode } from 'tiptap-utility';
const parentNode = editor.state.doc.nodeAt(0); // Example parent node
if (parentNode) {
const lastChild = getLastChildNode(parentNode);
if (lastChild) {
console.log(`Last child node type: ${lastChild.node.type.name}`);
console.log(`Position: ${lastChild.pos}`);
} else {
console.log('No child nodes found.');
}
}
Finds the next sibling node of a given node within its parent.
-
parent
(required): A ProseMirrorNode
representing the parent container. -
currentNode
(required): The child node whose next sibling needs to be found.
-
{ node: Node } | null
:- If a next sibling exists, returns an object containing:
-
node
: The next siblingNode
.
-
- Returns
null
if there is no next sibling.
- If a next sibling exists, returns an object containing:
import { getNextSiblingNode } from 'tiptap-utility';
const parentNode = editor.state.doc.nodeAt(0); // Example parent node
const currentNode = parentNode?.firstChild; // Example current node
if (parentNode && currentNode) {
const nextSibling = getNextSiblingNode(parentNode, currentNode);
if (nextSibling) {
console.log(`Next sibling node type: ${nextSibling.node.type.name}`);
} else {
console.log('No next sibling found.');
}
}
This package is open-source and available under the MIT License.