@tiptap/extension-node-range
Version:
node range extension for tiptap
35 lines (26 loc) • 1.03 kB
text/typescript
import { type ResolvedPos, NodeRange } from '@tiptap/pm/model'
import { SelectionRange } from '@tiptap/pm/state'
export function getSelectionRanges($from: ResolvedPos, $to: ResolvedPos, depth?: number): SelectionRange[] {
const ranges: SelectionRange[] = []
const doc = $from.node(0)
// Determine the appropriate depth
if (typeof depth === 'number' && depth >= 0) {
// Use the provided depth
} else if ($from.sameParent($to)) {
depth = Math.max(0, $from.sharedDepth($to.pos) - 1)
} else {
depth = $from.sharedDepth($to.pos)
}
const nodeRange = new NodeRange($from, $to, depth)
const offset = nodeRange.depth === 0 ? 0 : doc.resolve(nodeRange.start).posAtIndex(0)
nodeRange.parent.forEach((node, pos) => {
const from = offset + pos
const to = from + node.nodeSize
if (from < nodeRange.start || from >= nodeRange.end) {
return
}
const selectionRange = new SelectionRange(doc.resolve(from), doc.resolve(to))
ranges.push(selectionRange)
})
return ranges
}