@expensify/react-native-live-markdown 0.1.332 → 0.1.334
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/README.md +5 -4
- package/lib/commonjs/web/utils/cursorUtils.js +16 -2
- package/lib/commonjs/web/utils/cursorUtils.js.map +1 -1
- package/lib/module/web/utils/cursorUtils.js +16 -2
- package/lib/module/web/utils/cursorUtils.js.map +1 -1
- package/lib/typescript/src/web/utils/cursorUtils.d.ts.map +1 -1
- package/package.json +2 -2
- package/src/web/utils/cursorUtils.ts +17 -2
package/README.md
CHANGED
|
@@ -211,10 +211,11 @@ Currently, `react-native-live-markdown` supports only [ExpensiMark](https://gith
|
|
|
211
211
|
|
|
212
212
|
### `react-native-worklets` compatibility
|
|
213
213
|
|
|
214
|
-
| | 0.6.x | 0.7.x | 0.8.x | 0.9.x |
|
|
215
|
-
|
|
216
|
-
| 0.1.
|
|
217
|
-
| 0.1.
|
|
214
|
+
| | 0.6.x | 0.7.x | 0.8.x | 0.9.x | 0.10.2+ |
|
|
215
|
+
|:-----------------:|:-----:|:-----:|:-----:|:-----:|:-------:|
|
|
216
|
+
| 0.1.333+ | ❌ | ✅ | ✅ | ✅ | ✅ |
|
|
217
|
+
| 0.1.321 – 0.1.332 | ❌ | ✅ | ✅ | ✅ | ❌ |
|
|
218
|
+
| 0.1.308 – 0.1.320 | ✅ | ❌ | ❌ | ❌ | ❌ |
|
|
218
219
|
|
|
219
220
|
|
|
220
221
|
## License
|
|
@@ -10,6 +10,18 @@ exports.scrollIntoView = scrollIntoView;
|
|
|
10
10
|
exports.setCursorPosition = setCursorPosition;
|
|
11
11
|
var _blockUtils = require("./blockUtils.js");
|
|
12
12
|
var _treeUtils = require("./treeUtils.js");
|
|
13
|
+
function getMaxRangeOffset(node) {
|
|
14
|
+
return node.nodeType === Node.TEXT_NODE ? (node.textContent ?? '').length : node.childNodes.length;
|
|
15
|
+
}
|
|
16
|
+
|
|
17
|
+
/**
|
|
18
|
+
* Range offsets are applied to the real DOM node, not the parsed markdown tree.
|
|
19
|
+
* When the tree is temporarily stale, clamp to the DOM node's bounds so cursor
|
|
20
|
+
* restoration lands at the nearest valid position instead of throwing.
|
|
21
|
+
*/
|
|
22
|
+
function getClampedRangeOffset(node, offset) {
|
|
23
|
+
return Math.max(0, Math.min(offset, getMaxRangeOffset(node)));
|
|
24
|
+
}
|
|
13
25
|
function setCursorPosition(target, startIndex, endIndex = null, shouldScrollIntoView = false) {
|
|
14
26
|
// We don't want to move the cursor if the target is not focused
|
|
15
27
|
if (!target.tree || target !== document.activeElement) {
|
|
@@ -32,13 +44,15 @@ function setCursorPosition(target, startIndex, endIndex = null, shouldScrollInto
|
|
|
32
44
|
range.setStartBefore(startTreeNode.element);
|
|
33
45
|
} else {
|
|
34
46
|
const startElement = startTreeNode.element;
|
|
35
|
-
|
|
47
|
+
const startNode = startElement.childNodes[0] || startElement;
|
|
48
|
+
range.setStart(startNode, getClampedRangeOffset(startNode, start - startTreeNode.start));
|
|
36
49
|
}
|
|
37
50
|
if (endTreeNode.type === 'br') {
|
|
38
51
|
range.setEndBefore(endTreeNode.element);
|
|
39
52
|
} else {
|
|
40
53
|
const endElement = endTreeNode.element;
|
|
41
|
-
|
|
54
|
+
const endNode = endElement.childNodes[0] || endElement;
|
|
55
|
+
range.setEnd(endNode, getClampedRangeOffset(endNode, (end || start) - endTreeNode.start));
|
|
42
56
|
}
|
|
43
57
|
if (!end) {
|
|
44
58
|
range.collapse(true);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["_blockUtils","require","_treeUtils","
|
|
1
|
+
{"version":3,"names":["_blockUtils","require","_treeUtils","getMaxRangeOffset","node","nodeType","Node","TEXT_NODE","textContent","length","childNodes","getClampedRangeOffset","offset","Math","max","min","setCursorPosition","target","startIndex","endIndex","shouldScrollIntoView","tree","document","activeElement","start","end","range","createRange","selectNodeContents","startTreeNode","getTreeNodeByIndex","endTreeNode","console","error","type","setStartBefore","element","startElement","startNode","setStart","setEndBefore","endElement","endNode","setEnd","collapse","selection","window","getSelection","setBaseAndExtent","startContainer","startOffset","endContainer","endOffset","scrollIntoView","scrollTargetElement","targetElement","isChildOfMultilineMarkdownElement","orderIndex","Number","split","currentLine","nodeName","addRange","span","createElement","insertNode","block","remove","caretRect","getBoundingClientRect","targetRect","top","height","scrollTop","moveCursorToEnd","getCurrentCursorPosition","getHTMLElement","Text","parentElement","rangeCount","getRangeAt","findHTMLElementInTree","parentNode","value","removeSelection","removeAllRanges"],"sourceRoot":"../../../../src","sources":["web/utils/cursorUtils.ts"],"mappings":"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","ignoreList":[]}
|
|
@@ -2,6 +2,18 @@
|
|
|
2
2
|
|
|
3
3
|
import { isChildOfMultilineMarkdownElement } from "./blockUtils.js";
|
|
4
4
|
import { findHTMLElementInTree, getTreeNodeByIndex } from "./treeUtils.js";
|
|
5
|
+
function getMaxRangeOffset(node) {
|
|
6
|
+
return node.nodeType === Node.TEXT_NODE ? (node.textContent ?? '').length : node.childNodes.length;
|
|
7
|
+
}
|
|
8
|
+
|
|
9
|
+
/**
|
|
10
|
+
* Range offsets are applied to the real DOM node, not the parsed markdown tree.
|
|
11
|
+
* When the tree is temporarily stale, clamp to the DOM node's bounds so cursor
|
|
12
|
+
* restoration lands at the nearest valid position instead of throwing.
|
|
13
|
+
*/
|
|
14
|
+
function getClampedRangeOffset(node, offset) {
|
|
15
|
+
return Math.max(0, Math.min(offset, getMaxRangeOffset(node)));
|
|
16
|
+
}
|
|
5
17
|
function setCursorPosition(target, startIndex, endIndex = null, shouldScrollIntoView = false) {
|
|
6
18
|
// We don't want to move the cursor if the target is not focused
|
|
7
19
|
if (!target.tree || target !== document.activeElement) {
|
|
@@ -24,13 +36,15 @@ function setCursorPosition(target, startIndex, endIndex = null, shouldScrollInto
|
|
|
24
36
|
range.setStartBefore(startTreeNode.element);
|
|
25
37
|
} else {
|
|
26
38
|
const startElement = startTreeNode.element;
|
|
27
|
-
|
|
39
|
+
const startNode = startElement.childNodes[0] || startElement;
|
|
40
|
+
range.setStart(startNode, getClampedRangeOffset(startNode, start - startTreeNode.start));
|
|
28
41
|
}
|
|
29
42
|
if (endTreeNode.type === 'br') {
|
|
30
43
|
range.setEndBefore(endTreeNode.element);
|
|
31
44
|
} else {
|
|
32
45
|
const endElement = endTreeNode.element;
|
|
33
|
-
|
|
46
|
+
const endNode = endElement.childNodes[0] || endElement;
|
|
47
|
+
range.setEnd(endNode, getClampedRangeOffset(endNode, (end || start) - endTreeNode.start));
|
|
34
48
|
}
|
|
35
49
|
if (!end) {
|
|
36
50
|
range.collapse(true);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["isChildOfMultilineMarkdownElement","findHTMLElementInTree","getTreeNodeByIndex","
|
|
1
|
+
{"version":3,"names":["isChildOfMultilineMarkdownElement","findHTMLElementInTree","getTreeNodeByIndex","getMaxRangeOffset","node","nodeType","Node","TEXT_NODE","textContent","length","childNodes","getClampedRangeOffset","offset","Math","max","min","setCursorPosition","target","startIndex","endIndex","shouldScrollIntoView","tree","document","activeElement","start","end","range","createRange","selectNodeContents","startTreeNode","endTreeNode","console","error","type","setStartBefore","element","startElement","startNode","setStart","setEndBefore","endElement","endNode","setEnd","collapse","selection","window","getSelection","setBaseAndExtent","startContainer","startOffset","endContainer","endOffset","scrollIntoView","scrollTargetElement","targetElement","orderIndex","Number","split","currentLine","nodeName","addRange","span","createElement","insertNode","block","remove","caretRect","getBoundingClientRect","targetRect","top","height","scrollTop","moveCursorToEnd","getCurrentCursorPosition","getHTMLElement","Text","parentElement","rangeCount","getRangeAt","parentNode","value","removeSelection","removeAllRanges"],"sourceRoot":"../../../../src","sources":["web/utils/cursorUtils.ts"],"mappings":"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","ignoreList":[]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"cursorUtils.d.ts","sourceRoot":"","sources":["../../../../../src/web/utils/cursorUtils.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAC,wBAAwB,EAAC,MAAM,6BAA6B,CAAC;AAG1E,OAAO,KAAK,EAAC,QAAQ,EAAC,MAAM,aAAa,CAAC;
|
|
1
|
+
{"version":3,"file":"cursorUtils.d.ts","sourceRoot":"","sources":["../../../../../src/web/utils/cursorUtils.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAC,wBAAwB,EAAC,MAAM,6BAA6B,CAAC;AAG1E,OAAO,KAAK,EAAC,QAAQ,EAAC,MAAM,aAAa,CAAC;AAe1C,iBAAS,iBAAiB,CAAC,MAAM,EAAE,wBAAwB,EAAE,UAAU,EAAE,MAAM,EAAE,QAAQ,GAAE,MAAM,GAAG,IAAW,EAAE,oBAAoB,UAAQ,QAkD5I;AAED,iBAAS,cAAc,CAAC,MAAM,EAAE,wBAAwB,EAAE,IAAI,EAAE,QAAQ,QA0CvE;AAED,iBAAS,eAAe,CAAC,MAAM,EAAE,WAAW,QAQ3C;AAED,iBAAS,wBAAwB,CAAC,MAAM,EAAE,wBAAwB;;;SAiCjE;AAED,iBAAS,eAAe,SAKvB;AAED,OAAO,EAAC,wBAAwB,EAAE,eAAe,EAAE,iBAAiB,EAAE,eAAe,EAAE,cAAc,EAAC,CAAC"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@expensify/react-native-live-markdown",
|
|
3
|
-
"version": "0.1.
|
|
3
|
+
"version": "0.1.334",
|
|
4
4
|
"description": "Drop-in replacement for React Native's TextInput component with Markdown formatting.",
|
|
5
5
|
"main": "lib/commonjs/index",
|
|
6
6
|
"module": "lib/module/index",
|
|
@@ -103,7 +103,7 @@
|
|
|
103
103
|
"react-native": "0.85.3",
|
|
104
104
|
"react-native-builder-bob": "^0.30.2",
|
|
105
105
|
"react-native-web": "^0.20.0",
|
|
106
|
-
"react-native-worklets": "0.
|
|
106
|
+
"react-native-worklets": "0.10.2",
|
|
107
107
|
"release-it": "^15.0.0",
|
|
108
108
|
"turbo": "^1.10.7",
|
|
109
109
|
"typescript": "^5.8.3"
|
|
@@ -3,6 +3,19 @@ import {isChildOfMultilineMarkdownElement} from './blockUtils';
|
|
|
3
3
|
import {findHTMLElementInTree, getTreeNodeByIndex} from './treeUtils';
|
|
4
4
|
import type {TreeNode} from './treeUtils';
|
|
5
5
|
|
|
6
|
+
function getMaxRangeOffset(node: ChildNode): number {
|
|
7
|
+
return node.nodeType === Node.TEXT_NODE ? (node.textContent ?? '').length : node.childNodes.length;
|
|
8
|
+
}
|
|
9
|
+
|
|
10
|
+
/**
|
|
11
|
+
* Range offsets are applied to the real DOM node, not the parsed markdown tree.
|
|
12
|
+
* When the tree is temporarily stale, clamp to the DOM node's bounds so cursor
|
|
13
|
+
* restoration lands at the nearest valid position instead of throwing.
|
|
14
|
+
*/
|
|
15
|
+
function getClampedRangeOffset(node: ChildNode, offset: number): number {
|
|
16
|
+
return Math.max(0, Math.min(offset, getMaxRangeOffset(node)));
|
|
17
|
+
}
|
|
18
|
+
|
|
6
19
|
function setCursorPosition(target: MarkdownTextInputElement, startIndex: number, endIndex: number | null = null, shouldScrollIntoView = false) {
|
|
7
20
|
// We don't want to move the cursor if the target is not focused
|
|
8
21
|
if (!target.tree || target !== document.activeElement) {
|
|
@@ -29,14 +42,16 @@ function setCursorPosition(target: MarkdownTextInputElement, startIndex: number,
|
|
|
29
42
|
range.setStartBefore(startTreeNode.element);
|
|
30
43
|
} else {
|
|
31
44
|
const startElement = startTreeNode.element;
|
|
32
|
-
|
|
45
|
+
const startNode = (startElement.childNodes[0] || startElement) as ChildNode;
|
|
46
|
+
range.setStart(startNode, getClampedRangeOffset(startNode, start - startTreeNode.start));
|
|
33
47
|
}
|
|
34
48
|
|
|
35
49
|
if (endTreeNode.type === 'br') {
|
|
36
50
|
range.setEndBefore(endTreeNode.element);
|
|
37
51
|
} else {
|
|
38
52
|
const endElement = endTreeNode.element;
|
|
39
|
-
|
|
53
|
+
const endNode = (endElement.childNodes[0] || endElement) as ChildNode;
|
|
54
|
+
range.setEnd(endNode, getClampedRangeOffset(endNode, (end || start) - endTreeNode.start));
|
|
40
55
|
}
|
|
41
56
|
|
|
42
57
|
if (!end) {
|