| 12
 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
 
 |