@cocreate/selection 1.13.2 → 1.14.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +14 -0
- package/package.json +1 -1
- package/prettier.config.js +16 -0
- package/src/index.js +90 -82
package/CHANGELOG.md
CHANGED
@@ -1,3 +1,17 @@
|
|
1
|
+
# [1.14.0](https://github.com/CoCreate-app/CoCreate-selection/compare/v1.13.2...v1.14.0) (2024-11-04)
|
2
|
+
|
3
|
+
|
4
|
+
### Bug Fixes
|
5
|
+
|
6
|
+
* html[contenteditable] ([68b79f0](https://github.com/CoCreate-app/CoCreate-selection/commit/68b79f08d2f970fcd15abdf947dca9bc8b4146a9))
|
7
|
+
* observer taget has been renamed to selector ([c36ae20](https://github.com/CoCreate-app/CoCreate-selection/commit/c36ae20b8d254c3ede29ad559af93237c8a49115))
|
8
|
+
* pretier.config.js and file formating ([6039624](https://github.com/CoCreate-app/CoCreate-selection/commit/603962428197395e8db671597e4c5aea26b79524))
|
9
|
+
|
10
|
+
|
11
|
+
### Features
|
12
|
+
|
13
|
+
* add prettier.config.js and format files ([cf8e664](https://github.com/CoCreate-app/CoCreate-selection/commit/cf8e664884b66db4455a28c572099cefafc16c33))
|
14
|
+
|
1
15
|
## [1.13.2](https://github.com/CoCreate-app/CoCreate-selection/compare/v1.13.1...v1.13.2) (2024-09-21)
|
2
16
|
|
3
17
|
|
package/package.json
CHANGED
package/src/index.js
CHANGED
@@ -5,103 +5,111 @@ String.prototype.customSplice = function (index, absIndex, string) {
|
|
5
5
|
};
|
6
6
|
|
7
7
|
export function getSelection(element) {
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
let range = selection.getRangeAt(0);
|
21
|
-
|
22
|
-
let contenteditable
|
23
|
-
if (range.startContainer.nodeType === 3)
|
24
|
-
contenteditable = range.startContainer.parentElement.closest('[contenteditable][array][object][key]');
|
25
|
-
else
|
26
|
-
contenteditable = range.startContainer.closest('[contenteditable][array][object][key]');
|
27
|
-
|
28
|
-
if (contenteditable) {
|
29
|
-
element = contenteditable;
|
30
|
-
} else return { start: range.startOffset, end: range.endOffset }
|
8
|
+
try {
|
9
|
+
if (element.tagName === "INPUT" || element.tagName === "TEXTAREA") {
|
10
|
+
return {
|
11
|
+
start: element.selectionStart,
|
12
|
+
end: element.selectionEnd
|
13
|
+
};
|
14
|
+
} else {
|
15
|
+
let Document = element.ownerDocument;
|
16
|
+
let selection = Document.getSelection();
|
17
|
+
if (!selection.rangeCount)
|
18
|
+
return { start: 0, end: 0 };
|
31
19
|
|
32
|
-
|
33
|
-
if (!domTextEditor.htmlString) {
|
34
|
-
domTextEditor = domTextEditor.closest('[contenteditable]');
|
35
|
-
}
|
20
|
+
let range = selection.getRangeAt(0);
|
36
21
|
|
22
|
+
let contenteditable
|
23
|
+
if (range.startContainer.nodeType === 3)
|
24
|
+
contenteditable = range.startContainer.parentElement.closest('[contenteditable][array][object][key], html[contenteditable]');
|
25
|
+
else
|
26
|
+
contenteditable = range.startContainer.closest('[contenteditable][array][object][key], html[contenteditable]');
|
37
27
|
|
38
|
-
|
39
|
-
|
40
|
-
|
41
|
-
end = getNodePosition(range.endContainer, domTextEditor, range.endOffset)
|
42
|
-
} else if (range.endOffset !== range.startOffset)
|
43
|
-
end = start + (range.endOffset - range.startOffset)
|
28
|
+
if (contenteditable) {
|
29
|
+
element = contenteditable;
|
30
|
+
} else return { start: range.startOffset, end: range.endOffset }
|
44
31
|
|
45
|
-
|
46
|
-
|
47
|
-
|
32
|
+
let domTextEditor = element;
|
33
|
+
if (!domTextEditor.htmlString) {
|
34
|
+
domTextEditor = domTextEditor.closest('[contenteditable]');
|
35
|
+
}
|
48
36
|
|
49
|
-
let endContainer = range.endContainer;
|
50
|
-
if (endContainer.nodeType == 3)
|
51
|
-
endContainer = range.endContainer.parentElement;
|
52
37
|
|
53
|
-
|
54
|
-
|
55
|
-
|
56
|
-
|
57
|
-
|
58
|
-
|
59
|
-
|
38
|
+
let start = getNodePosition(range.startContainer, domTextEditor, range.startOffset)
|
39
|
+
let end = start
|
40
|
+
if (range.startContainer !== range.endContainer) {
|
41
|
+
end = getNodePosition(range.endContainer, domTextEditor, range.endOffset)
|
42
|
+
} else if (range.endOffset !== range.startOffset)
|
43
|
+
end = start + (range.endOffset - range.startOffset)
|
44
|
+
|
45
|
+
let startContainer = range.startContainer;
|
46
|
+
if (startContainer.nodeType == 3)
|
47
|
+
startContainer = range.startContainer.parentElement;
|
48
|
+
|
49
|
+
let endContainer = range.endContainer;
|
50
|
+
if (endContainer.nodeType == 3)
|
51
|
+
endContainer = range.endContainer.parentElement;
|
52
|
+
|
53
|
+
let textStart = 0, node = range.startContainer
|
54
|
+
while (node) {
|
55
|
+
textStart += node.textContent.length;
|
56
|
+
if (node === contenteditable)
|
57
|
+
node = undefined
|
58
|
+
else
|
59
|
+
node = node.previousSibling;
|
60
|
+
}
|
61
|
+
let textEnd = textStart + (range.endOffset - range.startOffset)
|
62
|
+
|
63
|
+
let rangeObj = {
|
64
|
+
element,
|
65
|
+
domTextEditor,
|
66
|
+
startOffset: range.startOffset,
|
67
|
+
endOffset: range.endOffset,
|
68
|
+
startContainer,
|
69
|
+
endContainer,
|
70
|
+
elementStart: start,
|
71
|
+
elementEnd: end,
|
72
|
+
nodeStartContainer: range.startContainer,
|
73
|
+
nodeEndContainer: range.endContainer,
|
74
|
+
textStart,
|
75
|
+
textEnd
|
76
|
+
};
|
77
|
+
|
78
|
+
return { element: contenteditable, value: selection.toString(), start, end, range: rangeObj };
|
60
79
|
}
|
61
|
-
|
62
|
-
|
63
|
-
let rangeObj = {
|
64
|
-
element,
|
65
|
-
domTextEditor,
|
66
|
-
startOffset: range.startOffset,
|
67
|
-
endOffset: range.endOffset,
|
68
|
-
startContainer,
|
69
|
-
endContainer,
|
70
|
-
elementStart: start,
|
71
|
-
elementEnd: end,
|
72
|
-
nodeStartContainer: range.startContainer,
|
73
|
-
nodeEndContainer: range.endContainer,
|
74
|
-
textStart,
|
75
|
-
textEnd
|
76
|
-
};
|
77
|
-
|
78
|
-
return { element: contenteditable, value: selection.toString(), start, end, range: rangeObj };
|
80
|
+
} catch (error) {
|
81
|
+
console.error("Error fetching selection from element:", error);
|
79
82
|
}
|
80
|
-
|
81
83
|
}
|
82
84
|
|
83
85
|
|
84
86
|
function getNodePosition(container, domTextEditor, position) {
|
85
|
-
|
86
|
-
|
87
|
-
|
88
|
-
|
89
|
-
|
90
|
-
|
91
|
-
|
92
|
-
|
87
|
+
try {
|
88
|
+
let string = domTextEditor.htmlString
|
89
|
+
if (!string)
|
90
|
+
return 0
|
91
|
+
let node = container.previousSibling
|
92
|
+
while (node && node.nodeType === 3) {
|
93
|
+
position += node.textContent.length;
|
94
|
+
node = node.previousSibling;
|
95
|
+
}
|
96
|
+
|
97
|
+
let nodePosition
|
98
|
+
if (node && node.nodeType === 1) {
|
99
|
+
nodePosition = getStringPosition({ string, target: node, position: 'afterend' });
|
100
|
+
position += nodePosition.end
|
101
|
+
} else if (container.parentElement !== domTextEditor && container !== domTextEditor) {
|
102
|
+
let parentElement = container.parentElement
|
103
|
+
nodePosition = getStringPosition({ string, target: parentElement, position: 'afterbegin' });
|
104
|
+
position += nodePosition.start
|
105
|
+
}
|
106
|
+
|
107
|
+
return position
|
93
108
|
|
94
|
-
|
95
|
-
|
96
|
-
nodePosition = getStringPosition({ string, target: node, position: 'afterend' });
|
97
|
-
position += nodePosition.end
|
98
|
-
} else if (container.parentElement !== domTextEditor && container !== domTextEditor) {
|
99
|
-
let parentElement = container.parentElement
|
100
|
-
nodePosition = getStringPosition({ string, target: parentElement, position: 'afterbegin' });
|
101
|
-
position += nodePosition.start
|
109
|
+
} catch (error) {
|
110
|
+
console.error("Error getting node position:", error);
|
102
111
|
}
|
103
112
|
|
104
|
-
return position
|
105
113
|
}
|
106
114
|
|
107
115
|
export function processSelection(element, value = "", prev_start, prev_end, start, end, range) {
|