@expensify/react-native-live-markdown 0.1.31 → 0.1.32
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/lib/commonjs/web/cursorUtils.js +37 -1
- package/lib/commonjs/web/cursorUtils.js.map +1 -1
- package/lib/module/web/cursorUtils.js +37 -2
- package/lib/module/web/cursorUtils.js.map +1 -1
- package/lib/typescript/src/web/cursorUtils.d.ts +2 -1
- package/lib/typescript/src/web/cursorUtils.d.ts.map +1 -1
- package/package.json +1 -1
- package/src/web/cursorUtils.ts +44 -2
|
@@ -8,9 +8,11 @@ exports.moveCursorToEnd = moveCursorToEnd;
|
|
|
8
8
|
exports.removeSelection = removeSelection;
|
|
9
9
|
exports.scrollCursorIntoView = scrollCursorIntoView;
|
|
10
10
|
exports.setCursorPosition = setCursorPosition;
|
|
11
|
+
exports.setPrevText = setPrevText;
|
|
11
12
|
var BrowserUtils = _interopRequireWildcard(require("./browserUtils"));
|
|
12
13
|
function _getRequireWildcardCache(e) { if ("function" != typeof WeakMap) return null; var r = new WeakMap(), t = new WeakMap(); return (_getRequireWildcardCache = function (e) { return e ? t : r; })(e); }
|
|
13
14
|
function _interopRequireWildcard(e, r) { if (!r && e && e.__esModule) return e; if (null === e || "object" != typeof e && "function" != typeof e) return { default: e }; var t = _getRequireWildcardCache(r); if (t && t.has(e)) return t.get(e); var n = { __proto__: null }, a = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var u in e) if ("default" !== u && Object.prototype.hasOwnProperty.call(e, u)) { var i = a ? Object.getOwnPropertyDescriptor(e, u) : null; i && (i.get || i.set) ? Object.defineProperty(n, u, i) : n[u] = e[u]; } return n.default = e, t && t.set(e, n), n; }
|
|
15
|
+
let prevTextLength;
|
|
14
16
|
function findTextNodes(textNodes, node) {
|
|
15
17
|
if (node.nodeType === Node.TEXT_NODE) {
|
|
16
18
|
textNodes.push(node);
|
|
@@ -23,11 +25,26 @@ function findTextNodes(textNodes, node) {
|
|
|
23
25
|
}
|
|
24
26
|
}
|
|
25
27
|
}
|
|
28
|
+
function setPrevText(target) {
|
|
29
|
+
var _textNodes$map;
|
|
30
|
+
let text = [];
|
|
31
|
+
const textNodes = [];
|
|
32
|
+
findTextNodes(textNodes, target);
|
|
33
|
+
text = (_textNodes$map = textNodes.map(e => e.nodeValue ?? '')) === null || _textNodes$map === void 0 || (_textNodes$map = _textNodes$map.join('')) === null || _textNodes$map === void 0 ? void 0 : _textNodes$map.split('');
|
|
34
|
+
prevTextLength = text.length;
|
|
35
|
+
}
|
|
26
36
|
function setCursorPosition(target, start, end = null) {
|
|
37
|
+
var _textNodes$map2;
|
|
27
38
|
const range = document.createRange();
|
|
28
39
|
range.selectNodeContents(target);
|
|
29
40
|
const textNodes = [];
|
|
30
41
|
findTextNodes(textNodes, target);
|
|
42
|
+
|
|
43
|
+
// These are utilities for handling the boundary cases (especially onEnter)
|
|
44
|
+
// prevChar & nextChar are characters before & after the target cursor position
|
|
45
|
+
const textCharacters = (_textNodes$map2 = textNodes.map(e => e.nodeValue ?? '')) === null || _textNodes$map2 === void 0 || (_textNodes$map2 = _textNodes$map2.join('')) === null || _textNodes$map2 === void 0 ? void 0 : _textNodes$map2.split('');
|
|
46
|
+
const prevChar = (textCharacters === null || textCharacters === void 0 ? void 0 : textCharacters[start - 1]) ?? '';
|
|
47
|
+
const nextChar = (textCharacters === null || textCharacters === void 0 ? void 0 : textCharacters[start]) ?? '';
|
|
31
48
|
let charCount = 0;
|
|
32
49
|
let startNode = null;
|
|
33
50
|
let endNode = null;
|
|
@@ -38,7 +55,26 @@ function setCursorPosition(target, start, end = null) {
|
|
|
38
55
|
const nextCharCount = charCount + textNode.length;
|
|
39
56
|
if (!startNode && start >= charCount && (start <= nextCharCount || start === nextCharCount && i < n - 1)) {
|
|
40
57
|
startNode = textNode;
|
|
41
|
-
|
|
58
|
+
|
|
59
|
+
// There are 4(/5) cases to consider here:
|
|
60
|
+
// 1. Caret in front of a character, when pressing enter
|
|
61
|
+
// 2. Caret at the end of a line (not last one)
|
|
62
|
+
// 3a. Caret at the end of whole input, when pressing enter - On firefox
|
|
63
|
+
// 3b. Caret at the end of whole input, when pressing enter - On other browsers
|
|
64
|
+
// 4. All other placements
|
|
65
|
+
if (prevChar === '\n' && prevTextLength !== undefined && prevTextLength < textCharacters.length) {
|
|
66
|
+
if (nextChar !== '\n') {
|
|
67
|
+
range.setStart(textNodes[i + 1], 0);
|
|
68
|
+
} else if (i !== textNodes.length - 1) {
|
|
69
|
+
range.setStart(textNodes[i], 1);
|
|
70
|
+
} else if (BrowserUtils.isFirefox) {
|
|
71
|
+
range.setStart(textNode, start - charCount);
|
|
72
|
+
} else {
|
|
73
|
+
range.setStart(textNodes[i], 2);
|
|
74
|
+
}
|
|
75
|
+
} else {
|
|
76
|
+
range.setStart(textNode, start - charCount);
|
|
77
|
+
}
|
|
42
78
|
if (!end) {
|
|
43
79
|
break;
|
|
44
80
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["BrowserUtils","_interopRequireWildcard","require","_getRequireWildcardCache","e","WeakMap","r","t","__esModule","default","has","get","n","__proto__","a","Object","defineProperty","getOwnPropertyDescriptor","u","prototype","hasOwnProperty","call","i","set","findTextNodes","textNodes","node","nodeType","Node","TEXT_NODE","push","length","childNodes","childNode","
|
|
1
|
+
{"version":3,"names":["BrowserUtils","_interopRequireWildcard","require","_getRequireWildcardCache","e","WeakMap","r","t","__esModule","default","has","get","n","__proto__","a","Object","defineProperty","getOwnPropertyDescriptor","u","prototype","hasOwnProperty","call","i","set","prevTextLength","findTextNodes","textNodes","node","nodeType","Node","TEXT_NODE","push","length","childNodes","childNode","setPrevText","target","_textNodes$map","text","map","nodeValue","join","split","setCursorPosition","start","end","_textNodes$map2","range","document","createRange","selectNodeContents","textCharacters","prevChar","nextChar","charCount","startNode","endNode","textNode","nextCharCount","undefined","setStart","isFirefox","setEnd","collapse","selection","window","getSelection","removeAllRanges","addRange","scrollCursorIntoView","moveCursorToEnd","getCurrentCursorPosition","rangeCount","getRangeAt","preSelectionRange","cloneRange","startContainer","startOffset","toString","removeSelection","selectionStart","value","caretRect","getClientRects","editableRect","getBoundingClientRect","paddingTop","parseFloat","getComputedStyle","borderTop","borderTopWidth","top","bottom","topToCaret","inputHeight","height","inputOffset","isChromium","scrollTo","scrollTop"],"sourceRoot":"../../../src","sources":["web/cursorUtils.ts"],"mappings":"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"}
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import * as BrowserUtils from './browserUtils';
|
|
2
|
+
let prevTextLength;
|
|
2
3
|
function findTextNodes(textNodes, node) {
|
|
3
4
|
if (node.nodeType === Node.TEXT_NODE) {
|
|
4
5
|
textNodes.push(node);
|
|
@@ -11,11 +12,26 @@ function findTextNodes(textNodes, node) {
|
|
|
11
12
|
}
|
|
12
13
|
}
|
|
13
14
|
}
|
|
15
|
+
function setPrevText(target) {
|
|
16
|
+
var _textNodes$map;
|
|
17
|
+
let text = [];
|
|
18
|
+
const textNodes = [];
|
|
19
|
+
findTextNodes(textNodes, target);
|
|
20
|
+
text = (_textNodes$map = textNodes.map(e => e.nodeValue ?? '')) === null || _textNodes$map === void 0 || (_textNodes$map = _textNodes$map.join('')) === null || _textNodes$map === void 0 ? void 0 : _textNodes$map.split('');
|
|
21
|
+
prevTextLength = text.length;
|
|
22
|
+
}
|
|
14
23
|
function setCursorPosition(target, start, end = null) {
|
|
24
|
+
var _textNodes$map2;
|
|
15
25
|
const range = document.createRange();
|
|
16
26
|
range.selectNodeContents(target);
|
|
17
27
|
const textNodes = [];
|
|
18
28
|
findTextNodes(textNodes, target);
|
|
29
|
+
|
|
30
|
+
// These are utilities for handling the boundary cases (especially onEnter)
|
|
31
|
+
// prevChar & nextChar are characters before & after the target cursor position
|
|
32
|
+
const textCharacters = (_textNodes$map2 = textNodes.map(e => e.nodeValue ?? '')) === null || _textNodes$map2 === void 0 || (_textNodes$map2 = _textNodes$map2.join('')) === null || _textNodes$map2 === void 0 ? void 0 : _textNodes$map2.split('');
|
|
33
|
+
const prevChar = (textCharacters === null || textCharacters === void 0 ? void 0 : textCharacters[start - 1]) ?? '';
|
|
34
|
+
const nextChar = (textCharacters === null || textCharacters === void 0 ? void 0 : textCharacters[start]) ?? '';
|
|
19
35
|
let charCount = 0;
|
|
20
36
|
let startNode = null;
|
|
21
37
|
let endNode = null;
|
|
@@ -26,7 +42,26 @@ function setCursorPosition(target, start, end = null) {
|
|
|
26
42
|
const nextCharCount = charCount + textNode.length;
|
|
27
43
|
if (!startNode && start >= charCount && (start <= nextCharCount || start === nextCharCount && i < n - 1)) {
|
|
28
44
|
startNode = textNode;
|
|
29
|
-
|
|
45
|
+
|
|
46
|
+
// There are 4(/5) cases to consider here:
|
|
47
|
+
// 1. Caret in front of a character, when pressing enter
|
|
48
|
+
// 2. Caret at the end of a line (not last one)
|
|
49
|
+
// 3a. Caret at the end of whole input, when pressing enter - On firefox
|
|
50
|
+
// 3b. Caret at the end of whole input, when pressing enter - On other browsers
|
|
51
|
+
// 4. All other placements
|
|
52
|
+
if (prevChar === '\n' && prevTextLength !== undefined && prevTextLength < textCharacters.length) {
|
|
53
|
+
if (nextChar !== '\n') {
|
|
54
|
+
range.setStart(textNodes[i + 1], 0);
|
|
55
|
+
} else if (i !== textNodes.length - 1) {
|
|
56
|
+
range.setStart(textNodes[i], 1);
|
|
57
|
+
} else if (BrowserUtils.isFirefox) {
|
|
58
|
+
range.setStart(textNode, start - charCount);
|
|
59
|
+
} else {
|
|
60
|
+
range.setStart(textNodes[i], 2);
|
|
61
|
+
}
|
|
62
|
+
} else {
|
|
63
|
+
range.setStart(textNode, start - charCount);
|
|
64
|
+
}
|
|
30
65
|
if (!end) {
|
|
31
66
|
break;
|
|
32
67
|
}
|
|
@@ -102,5 +137,5 @@ function scrollCursorIntoView(target) {
|
|
|
102
137
|
target.scrollTo(0, topToCaret + target.scrollTop + inputOffset);
|
|
103
138
|
}
|
|
104
139
|
}
|
|
105
|
-
export { getCurrentCursorPosition, moveCursorToEnd, setCursorPosition, removeSelection, scrollCursorIntoView };
|
|
140
|
+
export { getCurrentCursorPosition, moveCursorToEnd, setCursorPosition, setPrevText, removeSelection, scrollCursorIntoView };
|
|
106
141
|
//# sourceMappingURL=cursorUtils.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["BrowserUtils","findTextNodes","textNodes","node","nodeType","Node","TEXT_NODE","push","i","length","childNodes","childNode","
|
|
1
|
+
{"version":3,"names":["BrowserUtils","prevTextLength","findTextNodes","textNodes","node","nodeType","Node","TEXT_NODE","push","i","length","childNodes","childNode","setPrevText","target","_textNodes$map","text","map","e","nodeValue","join","split","setCursorPosition","start","end","_textNodes$map2","range","document","createRange","selectNodeContents","textCharacters","prevChar","nextChar","charCount","startNode","endNode","n","textNode","nextCharCount","undefined","setStart","isFirefox","setEnd","collapse","selection","window","getSelection","removeAllRanges","addRange","scrollCursorIntoView","moveCursorToEnd","getCurrentCursorPosition","rangeCount","getRangeAt","preSelectionRange","cloneRange","startContainer","startOffset","toString","removeSelection","selectionStart","value","caretRect","getClientRects","editableRect","getBoundingClientRect","paddingTop","parseFloat","getComputedStyle","borderTop","borderTopWidth","top","bottom","topToCaret","inputHeight","height","inputOffset","isChromium","scrollTo","scrollTop"],"sourceRoot":"../../../src","sources":["web/cursorUtils.ts"],"mappings":"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"}
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
declare function setPrevText(target: HTMLElement): void;
|
|
1
2
|
declare function setCursorPosition(target: HTMLElement, start: number, end?: number | null): void;
|
|
2
3
|
declare function moveCursorToEnd(target: HTMLElement): void;
|
|
3
4
|
declare function getCurrentCursorPosition(target: HTMLElement): {
|
|
@@ -6,5 +7,5 @@ declare function getCurrentCursorPosition(target: HTMLElement): {
|
|
|
6
7
|
} | null;
|
|
7
8
|
declare function removeSelection(): void;
|
|
8
9
|
declare function scrollCursorIntoView(target: HTMLInputElement): void;
|
|
9
|
-
export { getCurrentCursorPosition, moveCursorToEnd, setCursorPosition, removeSelection, scrollCursorIntoView };
|
|
10
|
+
export { getCurrentCursorPosition, moveCursorToEnd, setCursorPosition, setPrevText, removeSelection, scrollCursorIntoView };
|
|
10
11
|
//# sourceMappingURL=cursorUtils.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"cursorUtils.d.ts","sourceRoot":"","sources":["../../../../src/web/cursorUtils.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"cursorUtils.d.ts","sourceRoot":"","sources":["../../../../src/web/cursorUtils.ts"],"names":[],"mappings":"AAiBA,iBAAS,WAAW,CAAC,MAAM,EAAE,WAAW,QAUvC;AAED,iBAAS,iBAAiB,CAAC,MAAM,EAAE,WAAW,EAAE,KAAK,EAAE,MAAM,EAAE,GAAG,GAAE,MAAM,GAAG,IAAW,QAsEvF;AAED,iBAAS,eAAe,CAAC,MAAM,EAAE,WAAW,QAS3C;AAED,iBAAS,wBAAwB,CAAC,MAAM,EAAE,WAAW;;;SAYpD;AAED,iBAAS,eAAe,SAKvB;AAED,iBAAS,oBAAoB,CAAC,MAAM,EAAE,gBAAgB,QAyBrD;AAED,OAAO,EAAC,wBAAwB,EAAE,eAAe,EAAE,iBAAiB,EAAE,WAAW,EAAE,eAAe,EAAE,oBAAoB,EAAC,CAAC"}
|
package/package.json
CHANGED
package/src/web/cursorUtils.ts
CHANGED
|
@@ -1,5 +1,7 @@
|
|
|
1
1
|
import * as BrowserUtils from './browserUtils';
|
|
2
2
|
|
|
3
|
+
let prevTextLength: number | undefined;
|
|
4
|
+
|
|
3
5
|
function findTextNodes(textNodes: Text[], node: ChildNode) {
|
|
4
6
|
if (node.nodeType === Node.TEXT_NODE) {
|
|
5
7
|
textNodes.push(node as Text);
|
|
@@ -13,6 +15,18 @@ function findTextNodes(textNodes: Text[], node: ChildNode) {
|
|
|
13
15
|
}
|
|
14
16
|
}
|
|
15
17
|
|
|
18
|
+
function setPrevText(target: HTMLElement) {
|
|
19
|
+
let text = [];
|
|
20
|
+
const textNodes: Text[] = [];
|
|
21
|
+
findTextNodes(textNodes, target);
|
|
22
|
+
text = textNodes
|
|
23
|
+
.map((e) => e.nodeValue ?? '')
|
|
24
|
+
?.join('')
|
|
25
|
+
?.split('');
|
|
26
|
+
|
|
27
|
+
prevTextLength = text.length;
|
|
28
|
+
}
|
|
29
|
+
|
|
16
30
|
function setCursorPosition(target: HTMLElement, start: number, end: number | null = null) {
|
|
17
31
|
const range = document.createRange();
|
|
18
32
|
range.selectNodeContents(target);
|
|
@@ -20,6 +34,15 @@ function setCursorPosition(target: HTMLElement, start: number, end: number | nul
|
|
|
20
34
|
const textNodes: Text[] = [];
|
|
21
35
|
findTextNodes(textNodes, target);
|
|
22
36
|
|
|
37
|
+
// These are utilities for handling the boundary cases (especially onEnter)
|
|
38
|
+
// prevChar & nextChar are characters before & after the target cursor position
|
|
39
|
+
const textCharacters = textNodes
|
|
40
|
+
.map((e) => e.nodeValue ?? '')
|
|
41
|
+
?.join('')
|
|
42
|
+
?.split('');
|
|
43
|
+
const prevChar = textCharacters?.[start - 1] ?? '';
|
|
44
|
+
const nextChar = textCharacters?.[start] ?? '';
|
|
45
|
+
|
|
23
46
|
let charCount = 0;
|
|
24
47
|
let startNode: Text | null = null;
|
|
25
48
|
let endNode: Text | null = null;
|
|
@@ -31,7 +54,26 @@ function setCursorPosition(target: HTMLElement, start: number, end: number | nul
|
|
|
31
54
|
|
|
32
55
|
if (!startNode && start >= charCount && (start <= nextCharCount || (start === nextCharCount && i < n - 1))) {
|
|
33
56
|
startNode = textNode;
|
|
34
|
-
|
|
57
|
+
|
|
58
|
+
// There are 4(/5) cases to consider here:
|
|
59
|
+
// 1. Caret in front of a character, when pressing enter
|
|
60
|
+
// 2. Caret at the end of a line (not last one)
|
|
61
|
+
// 3a. Caret at the end of whole input, when pressing enter - On firefox
|
|
62
|
+
// 3b. Caret at the end of whole input, when pressing enter - On other browsers
|
|
63
|
+
// 4. All other placements
|
|
64
|
+
if (prevChar === '\n' && prevTextLength !== undefined && prevTextLength < textCharacters.length) {
|
|
65
|
+
if (nextChar !== '\n') {
|
|
66
|
+
range.setStart(textNodes[i + 1] as Node, 0);
|
|
67
|
+
} else if (i !== textNodes.length - 1) {
|
|
68
|
+
range.setStart(textNodes[i] as Node, 1);
|
|
69
|
+
} else if (BrowserUtils.isFirefox) {
|
|
70
|
+
range.setStart(textNode, start - charCount);
|
|
71
|
+
} else {
|
|
72
|
+
range.setStart(textNodes[i] as Node, 2);
|
|
73
|
+
}
|
|
74
|
+
} else {
|
|
75
|
+
range.setStart(textNode, start - charCount);
|
|
76
|
+
}
|
|
35
77
|
if (!end) {
|
|
36
78
|
break;
|
|
37
79
|
}
|
|
@@ -116,4 +158,4 @@ function scrollCursorIntoView(target: HTMLInputElement) {
|
|
|
116
158
|
}
|
|
117
159
|
}
|
|
118
160
|
|
|
119
|
-
export {getCurrentCursorPosition, moveCursorToEnd, setCursorPosition, removeSelection, scrollCursorIntoView};
|
|
161
|
+
export {getCurrentCursorPosition, moveCursorToEnd, setCursorPosition, setPrevText, removeSelection, scrollCursorIntoView};
|