@expensify/react-native-live-markdown 0.1.3 → 0.1.4

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.
Files changed (53) hide show
  1. package/lib/commonjs/MarkdownTextInput.js +5 -55
  2. package/lib/commonjs/MarkdownTextInput.js.map +1 -1
  3. package/lib/commonjs/MarkdownTextInput.web.js +399 -9
  4. package/lib/commonjs/MarkdownTextInput.web.js.map +1 -1
  5. package/lib/commonjs/react-native-web.d.js +2 -0
  6. package/lib/commonjs/react-native-web.d.js.map +1 -0
  7. package/lib/commonjs/styleUtils.js +61 -0
  8. package/lib/commonjs/styleUtils.js.map +1 -0
  9. package/lib/commonjs/web/InputHistory.js +92 -0
  10. package/lib/commonjs/web/InputHistory.js.map +1 -0
  11. package/lib/commonjs/web/MarkdownTextInput.css +24 -0
  12. package/lib/commonjs/web/cursorUtils.js +90 -0
  13. package/lib/commonjs/web/cursorUtils.js.map +1 -0
  14. package/lib/commonjs/web/parserUtils.js +170 -0
  15. package/lib/commonjs/web/parserUtils.js.map +1 -0
  16. package/lib/module/MarkdownTextInput.js +3 -55
  17. package/lib/module/MarkdownTextInput.js.map +1 -1
  18. package/lib/module/MarkdownTextInput.web.js +399 -12
  19. package/lib/module/MarkdownTextInput.web.js.map +1 -1
  20. package/lib/module/react-native-web.d.js +2 -0
  21. package/lib/module/react-native-web.d.js.map +1 -0
  22. package/lib/module/styleUtils.js +56 -0
  23. package/lib/module/styleUtils.js.map +1 -0
  24. package/lib/module/web/InputHistory.js +85 -0
  25. package/lib/module/web/InputHistory.js.map +1 -0
  26. package/lib/module/web/MarkdownTextInput.css +24 -0
  27. package/lib/module/web/cursorUtils.js +83 -0
  28. package/lib/module/web/cursorUtils.js.map +1 -0
  29. package/lib/module/web/parserUtils.js +162 -0
  30. package/lib/module/web/parserUtils.js.map +1 -0
  31. package/lib/parser/react-native-live-markdown-parser.js +34 -0
  32. package/lib/typescript/src/MarkdownTextInput.d.ts +3 -6
  33. package/lib/typescript/src/MarkdownTextInput.d.ts.map +1 -1
  34. package/lib/typescript/src/MarkdownTextInput.web.d.ts +9 -2
  35. package/lib/typescript/src/MarkdownTextInput.web.d.ts.map +1 -1
  36. package/lib/typescript/src/styleUtils.d.ts +9 -0
  37. package/lib/typescript/src/styleUtils.d.ts.map +1 -0
  38. package/lib/typescript/src/web/InputHistory.d.ts +24 -0
  39. package/lib/typescript/src/web/InputHistory.d.ts.map +1 -0
  40. package/lib/typescript/src/web/cursorUtils.d.ts +8 -0
  41. package/lib/typescript/src/web/cursorUtils.d.ts.map +1 -0
  42. package/lib/typescript/src/web/parserUtils.d.ts +16 -0
  43. package/lib/typescript/src/web/parserUtils.d.ts.map +1 -0
  44. package/package.json +6 -3
  45. package/parser/react-native-live-markdown-parser.js +7 -7
  46. package/src/MarkdownTextInput.tsx +9 -69
  47. package/src/MarkdownTextInput.web.tsx +516 -16
  48. package/src/react-native-web.d.ts +1 -0
  49. package/src/styleUtils.ts +70 -0
  50. package/src/web/InputHistory.ts +114 -0
  51. package/src/web/MarkdownTextInput.css +24 -0
  52. package/src/web/cursorUtils.ts +87 -0
  53. package/src/web/parserUtils.ts +194 -0
@@ -0,0 +1,83 @@
1
+ function createRange(node, targetPosition, ignoreNewLines = false) {
2
+ const range = document.createRange();
3
+ range.selectNode(node);
4
+ let pos = 0;
5
+ const stack = [node];
6
+ while (stack.length > 0) {
7
+ const current = stack.pop();
8
+ if (!current) {
9
+ break;
10
+ }
11
+ if (current.nodeType === Node.TEXT_NODE || current.nodeName === 'BR') {
12
+ const textContentLength = current.textContent ? current.textContent.length : 0;
13
+ const len = current.nodeName === 'BR' ? 1 : textContentLength;
14
+ if (pos + len >= targetPosition) {
15
+ if (current.nodeName === 'BR') {
16
+ range.setStartAfter(current);
17
+ current.scrollIntoView();
18
+ } else {
19
+ range.setStart(current, targetPosition - pos);
20
+ }
21
+ return range;
22
+ }
23
+ pos += len;
24
+ } else if (current.childNodes && current.childNodes.length > 0) {
25
+ for (let i = current.childNodes.length - 1; i >= 0; i--) {
26
+ const currentNode = current.childNodes[i];
27
+ if (currentNode && (!ignoreNewLines || ignoreNewLines && currentNode.nodeName !== 'BR')) {
28
+ stack.push(currentNode);
29
+ }
30
+ }
31
+ }
32
+ }
33
+ range.setStart(node, node.childNodes.length);
34
+ return range;
35
+ }
36
+ function setCursorPosition(target, targetPosition, ignoreNewLines = false) {
37
+ const range = createRange(target, targetPosition, ignoreNewLines);
38
+ const selection = window.getSelection();
39
+ if (selection) {
40
+ range.collapse(true);
41
+ selection.removeAllRanges();
42
+ selection.addRange(range);
43
+ }
44
+ }
45
+ function moveCursorToEnd(target) {
46
+ const range = document.createRange();
47
+ const selection = window.getSelection();
48
+ if (selection) {
49
+ range.setStart(target, target.childNodes.length);
50
+ range.collapse(true);
51
+ selection.removeAllRanges();
52
+ selection.addRange(range);
53
+ }
54
+ }
55
+ function getIndexedPosition(target, range, isStart) {
56
+ const marker = document.createTextNode('\0');
57
+ const rangeClone = range.cloneRange();
58
+ rangeClone.collapse(isStart);
59
+ rangeClone.insertNode(marker);
60
+ const position = target.innerText.indexOf('\0');
61
+ if (marker.parentNode) {
62
+ marker.parentNode.removeChild(marker);
63
+ }
64
+ return position;
65
+ }
66
+ function getCurrentCursorPosition(target) {
67
+ const selection = document.getSelection();
68
+ if (!selection || selection.rangeCount === 0) {
69
+ return {
70
+ start: target.innerText.length,
71
+ end: target.innerText.length
72
+ };
73
+ }
74
+ const range = selection.getRangeAt(0);
75
+ const start = getIndexedPosition(target, range, true);
76
+ const end = getIndexedPosition(target, range, false);
77
+ return {
78
+ start,
79
+ end
80
+ };
81
+ }
82
+ export { getCurrentCursorPosition, moveCursorToEnd, setCursorPosition };
83
+ //# sourceMappingURL=cursorUtils.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"names":["createRange","node","targetPosition","ignoreNewLines","range","document","selectNode","pos","stack","length","current","pop","nodeType","Node","TEXT_NODE","nodeName","textContentLength","textContent","len","setStartAfter","scrollIntoView","setStart","childNodes","i","currentNode","push","setCursorPosition","target","selection","window","getSelection","collapse","removeAllRanges","addRange","moveCursorToEnd","getIndexedPosition","isStart","marker","createTextNode","rangeClone","cloneRange","insertNode","position","innerText","indexOf","parentNode","removeChild","getCurrentCursorPosition","rangeCount","start","end","getRangeAt"],"sourceRoot":"../../../src","sources":["web/cursorUtils.ts"],"mappings":"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"}
@@ -0,0 +1,162 @@
1
+ import * as CursorUtils from './cursorUtils';
2
+ function addStyling(targetElement, type, markdownStyle) {
3
+ const node = targetElement;
4
+ switch (type) {
5
+ case 'syntax':
6
+ Object.assign(node.style, markdownStyle.syntax);
7
+ break;
8
+ case 'bold':
9
+ node.style.fontWeight = 'bold';
10
+ break;
11
+ case 'italic':
12
+ node.style.fontStyle = 'italic';
13
+ break;
14
+ case 'strikethrough':
15
+ node.style.textDecoration = 'line-through';
16
+ break;
17
+ case 'mention-here':
18
+ Object.assign(node.style, markdownStyle.mentionHere);
19
+ break;
20
+ case 'mention-user':
21
+ Object.assign(node.style, markdownStyle.mentionUser);
22
+ break;
23
+ case 'link':
24
+ Object.assign(node.style, {
25
+ ...markdownStyle.link,
26
+ textDecoration: 'underline'
27
+ });
28
+ break;
29
+ case 'code':
30
+ Object.assign(node.style, markdownStyle.code);
31
+ break;
32
+ case 'pre':
33
+ Object.assign(node.style, markdownStyle.pre);
34
+ break;
35
+ case 'blockquote':
36
+ Object.assign(node.style, {
37
+ ...markdownStyle.blockquote,
38
+ borderLeftStyle: 'solid',
39
+ display: 'inline-block',
40
+ maxWidth: '100%',
41
+ boxSizing: 'border-box'
42
+ });
43
+ break;
44
+ case 'h1':
45
+ Object.assign(node.style, {
46
+ ...markdownStyle.h1,
47
+ fontWeight: 'bold'
48
+ });
49
+ break;
50
+ default:
51
+ break;
52
+ }
53
+ }
54
+ function addSubstringAsTextNode(root, text, startIndex, endIndex) {
55
+ const substring = text.substring(startIndex, endIndex);
56
+ if (substring.length > 0) {
57
+ root.appendChild(document.createTextNode(substring));
58
+ }
59
+ }
60
+ function parseRangesToHTMLNodes(text, ranges, markdownStyle = {}, disableInlineStyles = false) {
61
+ const root = document.createElement('span');
62
+ root.className = 'root';
63
+ const textLength = text.length;
64
+ if (ranges.length === 0) {
65
+ addSubstringAsTextNode(root, text, 0, textLength);
66
+ return root;
67
+ }
68
+ const stack = [...ranges];
69
+ const nestedStack = [{
70
+ node: root,
71
+ endIndex: textLength
72
+ }];
73
+ let lastRangeEndIndex = 0;
74
+ while (stack.length > 0) {
75
+ const range = stack.shift();
76
+ if (!range) {
77
+ break;
78
+ }
79
+ let currentRoot = nestedStack[nestedStack.length - 1];
80
+ if (!currentRoot) {
81
+ break;
82
+ }
83
+ const endOfCurrentRange = range.startIndex + range.length;
84
+ const nextRangeStartIndex = stack.length > 0 && !!stack[0] ? stack[0].startIndex || 0 : textLength;
85
+ addSubstringAsTextNode(currentRoot.node, text, lastRangeEndIndex, range.startIndex); // add text with newlines before current range
86
+
87
+ const span = document.createElement('span');
88
+ if (disableInlineStyles) {
89
+ span.className = range.type;
90
+ } else {
91
+ addStyling(span, range.type, markdownStyle);
92
+ }
93
+ if (stack.length > 0 && nextRangeStartIndex < endOfCurrentRange && range.type !== 'syntax') {
94
+ // tag nesting
95
+ currentRoot.node.appendChild(span);
96
+ nestedStack.push({
97
+ node: span,
98
+ endIndex: endOfCurrentRange
99
+ });
100
+ lastRangeEndIndex = range.startIndex;
101
+ } else {
102
+ addSubstringAsTextNode(span, text, range.startIndex, endOfCurrentRange);
103
+ currentRoot.node.appendChild(span);
104
+ lastRangeEndIndex = endOfCurrentRange;
105
+
106
+ // end of tag nesting
107
+ while (nestedStack.length - 1 > 0 && nextRangeStartIndex >= currentRoot.endIndex) {
108
+ addSubstringAsTextNode(currentRoot.node, text, lastRangeEndIndex, currentRoot.endIndex);
109
+ const prevRoot = nestedStack.pop();
110
+ if (!prevRoot) {
111
+ break;
112
+ }
113
+ lastRangeEndIndex = prevRoot.endIndex;
114
+ currentRoot = nestedStack[nestedStack.length - 1] || currentRoot;
115
+ }
116
+ }
117
+ }
118
+ if (nestedStack.length > 1) {
119
+ const lastNestedNode = nestedStack[nestedStack.length - 1];
120
+ if (lastNestedNode) {
121
+ root.appendChild(lastNestedNode.node);
122
+ }
123
+ }
124
+ addSubstringAsTextNode(root, text, lastRangeEndIndex, textLength);
125
+ return root;
126
+ }
127
+ function parseText(target, text, curosrPositionIndex, markdownStyle = {}, disableNewLinesInCursorPositioning = false, alwaysMoveCursorToTheEnd = false) {
128
+ const targetElement = target;
129
+ let cursorPosition = curosrPositionIndex;
130
+ const isFocused = document.activeElement === target;
131
+ if (isFocused && curosrPositionIndex === null) {
132
+ cursorPosition = CursorUtils.getCurrentCursorPosition(target).start;
133
+ }
134
+ const ranges = global.parseExpensiMarkToRanges(text);
135
+ const markdownRanges = ranges.map(range => {
136
+ const [type, startIndex, length] = range;
137
+ return {
138
+ type: type,
139
+ startIndex,
140
+ length
141
+ };
142
+ });
143
+ targetElement.innerHTML = '';
144
+ targetElement.innerText = '';
145
+
146
+ // We don't want to parse text with single '\n', because contentEditable represents it as invisible <br />
147
+ if (!!text && text !== '\n') {
148
+ const dom = parseRangesToHTMLNodes(text, markdownRanges, markdownStyle);
149
+ target.appendChild(dom);
150
+ }
151
+ if (alwaysMoveCursorToTheEnd) {
152
+ CursorUtils.moveCursorToEnd(target);
153
+ } else if (isFocused && cursorPosition !== null) {
154
+ CursorUtils.setCursorPosition(target, cursorPosition, disableNewLinesInCursorPositioning);
155
+ }
156
+ return {
157
+ text: target.innerText,
158
+ cursorPosition: cursorPosition || 0
159
+ };
160
+ }
161
+ export { parseText, parseRangesToHTMLNodes };
162
+ //# sourceMappingURL=parserUtils.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"names":["CursorUtils","addStyling","targetElement","type","markdownStyle","node","Object","assign","style","syntax","fontWeight","fontStyle","textDecoration","mentionHere","mentionUser","link","code","pre","blockquote","borderLeftStyle","display","maxWidth","boxSizing","h1","addSubstringAsTextNode","root","text","startIndex","endIndex","substring","length","appendChild","document","createTextNode","parseRangesToHTMLNodes","ranges","disableInlineStyles","createElement","className","textLength","stack","nestedStack","lastRangeEndIndex","range","shift","currentRoot","endOfCurrentRange","nextRangeStartIndex","span","push","prevRoot","pop","lastNestedNode","parseText","target","curosrPositionIndex","disableNewLinesInCursorPositioning","alwaysMoveCursorToTheEnd","cursorPosition","isFocused","activeElement","getCurrentCursorPosition","start","global","parseExpensiMarkToRanges","markdownRanges","map","innerHTML","innerText","dom","moveCursorToEnd","setCursorPosition"],"sourceRoot":"../../../src","sources":["web/parserUtils.ts"],"mappings":"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"}