@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 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
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@cocreate/selection",
3
- "version": "1.13.2",
3
+ "version": "1.14.0",
4
4
  "description": "A simple selection component in vanilla javascript. Easily configured using HTML5 data-attributes and/or JavaScript API.",
5
5
  "keywords": [
6
6
  "selection",
@@ -0,0 +1,16 @@
1
+ module.exports = {
2
+ tabWidth: 4,
3
+ semi: true,
4
+ trailingComma: "none",
5
+ bracketSameLine: true,
6
+ useTabs: true,
7
+ overrides: [
8
+ {
9
+ files: ["*.json", "*.yml", "*.yaml"],
10
+ options: {
11
+ tabWidth: 2,
12
+ useTabs: false
13
+ },
14
+ }
15
+ ],
16
+ };
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
- if (element.tagName === "INPUT" || element.tagName === "TEXTAREA") {
9
- return {
10
- start: element.selectionStart,
11
- end: element.selectionEnd
12
- };
13
-
14
- } else {
15
- let Document = element.ownerDocument;
16
- let selection = Document.getSelection();
17
- if (!selection.rangeCount)
18
- return { start: 0, end: 0 };
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
- let domTextEditor = element;
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
- 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)
28
+ if (contenteditable) {
29
+ element = contenteditable;
30
+ } else return { start: range.startOffset, end: range.endOffset }
44
31
 
45
- let startContainer = range.startContainer;
46
- if (startContainer.nodeType == 3)
47
- startContainer = range.startContainer.parentElement;
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
- 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;
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
- 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 };
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
- let string = domTextEditor.htmlString
86
- if (!string)
87
- return 0
88
- let node = container.previousSibling
89
- while (node && node.nodeType === 3) {
90
- position += node.textContent.length;
91
- node = node.previousSibling;
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
- let nodePosition
95
- if (node && node.nodeType === 1) {
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) {