1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103
| import { DomEditor, IDomEditor, SlateEditor, SlateTransforms } from '@wangeditor/editor'
function addMouseHoverListener(editor: IDomEditor) { const editorElement = DomEditor.toDOMNode(editor, editor)
let hoverTimeout: NodeJS.Timeout | null = null let lastHoveredOffset: { x: number; y: number } | null = null
editorElement.addEventListener('mousemove', event => { const { clientX, clientY } = event
if (lastHoveredOffset && lastHoveredOffset.x === clientX && lastHoveredOffset.y === clientY) { return }
lastHoveredOffset = { x: clientX, y: clientY }
if (hoverTimeout) { clearTimeout(hoverTimeout) hoverTimeout = null }
hoverTimeout = setTimeout(() => { const domCaretPosition = document.caretPositionFromPoint?.(clientX, clientY) const domRange = domCaretPosition ? document.createRange() : document.caretRangeFromPoint?.(clientX, clientY)
if (domCaretPosition && domRange) { domRange.setStart(domCaretPosition.offsetNode, domCaretPosition.offset) domRange.collapse(true) }
if (!domRange) return
const slateNode = DomEditor.toSlateNode(editor, domRange.startContainer) const slatePath = DomEditor.findPath(editor, slateNode)
const nodeText = SlateEditor.string(editor, slatePath)
const offset = domCaretPosition?.offset || domRange.startOffset
const sentenceSeparators = ['。', '?', '!', '.', '?', '!']
const sentenceStart = (() => { let start = 0 for (const sep of sentenceSeparators) { const index = nodeText.lastIndexOf(sep, offset - 1) if (index !== -1) { start = Math.max(start, index + 1) } } return start })()
const sentenceEnd = (() => { let end = nodeText.length for (const sep of sentenceSeparators) { const index = nodeText.indexOf(sep, offset) if (index !== -1) { end = Math.min(end, index + 1) } } return end })()
const range = { anchor: { path: slatePath, offset: sentenceStart }, focus: { path: slatePath, offset: sentenceEnd }, }
if (!editor.isFocused()) { editor.focus() }
SlateTransforms.select(editor, range) }, 500) })
editorElement.addEventListener('mouseleave', () => { if (hoverTimeout) { clearTimeout(hoverTimeout) hoverTimeout = null } lastHoveredOffset = null }) }
export default addMouseHoverListener
|