-
Notifications
You must be signed in to change notification settings - Fork 1
/
Copy pathindex.js
64 lines (58 loc) · 2.34 KB
/
index.js
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
let mouseEvent = null
// document.addEventListener('selectstart', () => {
// mouseEvent = document.addEventListener('mouseup', () => {
// document.removeEventListener('mouseup', mouseEvent)
// const {
// anchorNode,
// extentNode,
// anchorOffset,
// extentOffset
// } = document.getSelection()
// const from = Math.min(anchorOffset, extentOffset)
// const to = Math.max(extentOffset, anchorOffset)
// if (to - from > 0 && anchorNode === extentNode) {
// const highlightedText = anchorNode.wholeText.slice(from, to)
// anchorNode.parentElement.innerHTML = `<span>${text.slice(0, from)}</span>`
// + `<span style="background: yellow">${highlightedText}</span>`
// + `<span>${text.slice(to)}</span>`
// }
// })
// })
function replacePart(range, el, isStart, isEnd) {
el.innerHTML =
(isStart ? '<span>' + el.innerText.slice(0, range.startOffset) + '</span>' : '') +
'<span style="background: yellow">' +
el.innerText.slice(
isStart ? range.startOffset : 0,
isEnd ? range.endOffset : undefined
) +
'</span>' +
(isEnd ? '<span>' + el.innerText.slice(range.endOffset) + '</span>' : '')
}
document.addEventListener('selectstart', () => {
mouseEvent = document.addEventListener('mouseup', () => {
document.removeEventListener('mouseup', mouseEvent)
const sel = document.getSelection()
const { anchorOffset, extentOffset } = sel
const range = sel.getRangeAt(0)
const from = Math.min(anchorOffset, extentOffset)
const to = Math.max(extentOffset, anchorOffset)
if (to - from > 0) {
const { startContainer, endContainer } = range
const isHighlighted = startContainer.parentElement.style.background === 'yellow'
if (isHighlighted) {
startContainer.parentElement.outerHTML =
startContainer.parentElement.innerText
} else {
const onlyMatch = startContainer === endContainer
replacePart(range, startContainer.parentElement, true, onlyMatch)
let lastNode = startContainer.parentElement
while (lastNode.nextSibling && lastNode !== endContainer) {
lastNode = lastNode.nextSibling
replacePart(range, lastNode, false, false)
}
if (!onlyMatch) replacePart(range, endContainer.parentElement, false, true)
}
}
})
})