import type { Node as ProseMirrorNode } from '@tiptap/pm/model' import { getPlainTextOffsetBeforeDocPosition } from '@admin/utils/editor/get-plain-text-offset-before-doc-position' import { TextSelection } from '@tiptap/pm/state' export function docPositionFromPlainTextOffset(doc: ProseMirrorNode, textOffset: number): number { const minPosition = TextSelection.atStart(doc).from const maxPosition = TextSelection.atEnd(doc).to const safeOffset = Math.max(0, textOffset) if (safeOffset === 0) return minPosition let low = minPosition let high = maxPosition while (low < high) { const midpoint = Math.floor((low + high) / 2) const currentOffset = getPlainTextOffsetBeforeDocPosition(doc, midpoint) if (currentOffset < safeOffset) { low = midpoint + 1 } else { high = midpoint } } return Math.max(minPosition, Math.min(low, maxPosition)) }