@expensify/react-native-live-markdown 0.1.3

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 (80) hide show
  1. package/LICENSE +20 -0
  2. package/README.md +139 -0
  3. package/RNLiveMarkdown.podspec +44 -0
  4. package/android/build.gradle +143 -0
  5. package/android/gradle.properties +5 -0
  6. package/android/src/main/AndroidManifest.xml +3 -0
  7. package/android/src/main/AndroidManifestNew.xml +2 -0
  8. package/android/src/main/cpp/CMakeLists.txt +23 -0
  9. package/android/src/main/cpp/MarkdownUtils.cpp +44 -0
  10. package/android/src/main/cpp/MarkdownUtils.h +41 -0
  11. package/android/src/main/cpp/OnLoad.cpp +8 -0
  12. package/android/src/main/java/com/expensify/livemarkdown/LiveMarkdownPackage.java +24 -0
  13. package/android/src/main/java/com/expensify/livemarkdown/MarkdownBackgroundColorSpan.java +11 -0
  14. package/android/src/main/java/com/expensify/livemarkdown/MarkdownBlockquoteSpan.java +47 -0
  15. package/android/src/main/java/com/expensify/livemarkdown/MarkdownBoldSpan.java +10 -0
  16. package/android/src/main/java/com/expensify/livemarkdown/MarkdownFontFamilySpan.java +39 -0
  17. package/android/src/main/java/com/expensify/livemarkdown/MarkdownFontSizeSpan.java +9 -0
  18. package/android/src/main/java/com/expensify/livemarkdown/MarkdownForegroundColorSpan.java +11 -0
  19. package/android/src/main/java/com/expensify/livemarkdown/MarkdownItalicSpan.java +10 -0
  20. package/android/src/main/java/com/expensify/livemarkdown/MarkdownLineHeightSpan.java +18 -0
  21. package/android/src/main/java/com/expensify/livemarkdown/MarkdownSpan.java +7 -0
  22. package/android/src/main/java/com/expensify/livemarkdown/MarkdownStrikethroughSpan.java +5 -0
  23. package/android/src/main/java/com/expensify/livemarkdown/MarkdownStyle.java +186 -0
  24. package/android/src/main/java/com/expensify/livemarkdown/MarkdownTextInputDecoratorView.java +85 -0
  25. package/android/src/main/java/com/expensify/livemarkdown/MarkdownTextInputDecoratorViewManager.java +31 -0
  26. package/android/src/main/java/com/expensify/livemarkdown/MarkdownTextWatcher.java +38 -0
  27. package/android/src/main/java/com/expensify/livemarkdown/MarkdownUnderlineSpan.java +5 -0
  28. package/android/src/main/java/com/expensify/livemarkdown/MarkdownUtils.java +176 -0
  29. package/android/src/newarch/MarkdownTextInputDecoratorViewManagerSpec.java +24 -0
  30. package/android/src/oldarch/MarkdownTextInputDecoratorViewManagerSpec.java +10 -0
  31. package/ios/MarkdownLayoutManager.h +12 -0
  32. package/ios/MarkdownLayoutManager.mm +35 -0
  33. package/ios/MarkdownTextInputDecoratorComponentView.h +12 -0
  34. package/ios/MarkdownTextInputDecoratorComponentView.mm +55 -0
  35. package/ios/MarkdownTextInputDecoratorView.h +12 -0
  36. package/ios/MarkdownTextInputDecoratorView.mm +106 -0
  37. package/ios/MarkdownTextInputDecoratorViewManager.h +8 -0
  38. package/ios/MarkdownTextInputDecoratorViewManager.mm +23 -0
  39. package/ios/RCTBackedTextFieldDelegateAdapter+Markdown.h +14 -0
  40. package/ios/RCTBackedTextFieldDelegateAdapter+Markdown.m +43 -0
  41. package/ios/RCTBaseTextInputView+Markdown.h +16 -0
  42. package/ios/RCTBaseTextInputView+Markdown.m +66 -0
  43. package/ios/RCTMarkdownStyle.h +35 -0
  44. package/ios/RCTMarkdownStyle.mm +81 -0
  45. package/ios/RCTMarkdownUtils.h +18 -0
  46. package/ios/RCTMarkdownUtils.mm +134 -0
  47. package/ios/RCTTextInputComponentView+Markdown.h +21 -0
  48. package/ios/RCTTextInputComponentView+Markdown.mm +51 -0
  49. package/ios/RCTUITextView+Markdown.h +15 -0
  50. package/ios/RCTUITextView+Markdown.mm +42 -0
  51. package/lib/commonjs/MarkdownTextInput.js +103 -0
  52. package/lib/commonjs/MarkdownTextInput.js.map +1 -0
  53. package/lib/commonjs/MarkdownTextInput.web.js +21 -0
  54. package/lib/commonjs/MarkdownTextInput.web.js.map +1 -0
  55. package/lib/commonjs/MarkdownTextInputDecoratorViewNativeComponent.js +10 -0
  56. package/lib/commonjs/MarkdownTextInputDecoratorViewNativeComponent.js.map +1 -0
  57. package/lib/commonjs/index.js +14 -0
  58. package/lib/commonjs/index.js.map +1 -0
  59. package/lib/module/MarkdownTextInput.js +96 -0
  60. package/lib/module/MarkdownTextInput.js.map +1 -0
  61. package/lib/module/MarkdownTextInput.web.js +15 -0
  62. package/lib/module/MarkdownTextInput.web.js.map +1 -0
  63. package/lib/module/MarkdownTextInputDecoratorViewNativeComponent.js +3 -0
  64. package/lib/module/MarkdownTextInputDecoratorViewNativeComponent.js.map +1 -0
  65. package/lib/module/index.js +2 -0
  66. package/lib/module/index.js.map +1 -0
  67. package/lib/typescript/src/MarkdownTextInput.d.ts +15 -0
  68. package/lib/typescript/src/MarkdownTextInput.d.ts.map +1 -0
  69. package/lib/typescript/src/MarkdownTextInput.web.d.ts +9 -0
  70. package/lib/typescript/src/MarkdownTextInput.web.d.ts.map +1 -0
  71. package/lib/typescript/src/MarkdownTextInputDecoratorViewNativeComponent.d.ts +46 -0
  72. package/lib/typescript/src/MarkdownTextInputDecoratorViewNativeComponent.d.ts.map +1 -0
  73. package/lib/typescript/src/index.d.ts +3 -0
  74. package/lib/typescript/src/index.d.ts.map +1 -0
  75. package/package.json +159 -0
  76. package/parser/react-native-live-markdown-parser.js +34 -0
  77. package/src/MarkdownTextInput.tsx +129 -0
  78. package/src/MarkdownTextInput.web.tsx +24 -0
  79. package/src/MarkdownTextInputDecoratorViewNativeComponent.ts +48 -0
  80. package/src/index.tsx +2 -0
@@ -0,0 +1,129 @@
1
+ import React from 'react';
2
+ import {Platform, StyleSheet, TextInput, processColor} from 'react-native';
3
+ import type {TextInputProps} from 'react-native';
4
+
5
+ import type * as MarkdownTextInputDecoractorView from './MarkdownTextInputDecoratorViewNativeComponent';
6
+ import MarkdownTextInputDecoratorViewNativeComponent from './MarkdownTextInputDecoratorViewNativeComponent';
7
+
8
+ type MarkdownStyle = MarkdownTextInputDecoractorView.MarkdownStyle;
9
+
10
+ const FONT_FAMILY_MONOSPACE = Platform.select({
11
+ ios: 'Courier',
12
+ default: 'monospace',
13
+ });
14
+
15
+ function makeDefaultMarkdownStyle(): MarkdownStyle {
16
+ return {
17
+ syntax: {
18
+ color: 'gray',
19
+ },
20
+ link: {
21
+ color: 'blue',
22
+ },
23
+ h1: {
24
+ fontSize: 25,
25
+ },
26
+ blockquote: {
27
+ borderColor: 'gray',
28
+ borderWidth: 6,
29
+ marginLeft: 6,
30
+ paddingLeft: 6,
31
+ },
32
+ code: {
33
+ fontFamily: FONT_FAMILY_MONOSPACE,
34
+ color: 'black',
35
+ backgroundColor: 'lightgray',
36
+ },
37
+ pre: {
38
+ fontFamily: FONT_FAMILY_MONOSPACE,
39
+ color: 'black',
40
+ backgroundColor: 'lightgray',
41
+ },
42
+ mentionHere: {
43
+ color: 'green',
44
+ backgroundColor: 'lime',
45
+ },
46
+ mentionUser: {
47
+ color: 'blue',
48
+ backgroundColor: 'cyan',
49
+ },
50
+ };
51
+ }
52
+
53
+ type PartialMarkdownStyle = Partial<{
54
+ [K in keyof MarkdownStyle]: Partial<MarkdownStyle[K]>;
55
+ }>;
56
+
57
+ function mergeMarkdownStyleWithDefault(input: PartialMarkdownStyle | undefined): MarkdownStyle {
58
+ const output = makeDefaultMarkdownStyle();
59
+
60
+ if (input !== undefined) {
61
+ Object.keys(input).forEach((key) => {
62
+ if (!(key in output)) {
63
+ return;
64
+ }
65
+ Object.assign(output[key as keyof MarkdownStyle], input[key as keyof MarkdownStyle]);
66
+ });
67
+ }
68
+
69
+ return output;
70
+ }
71
+
72
+ function processColorsInMarkdownStyle(input: MarkdownStyle): MarkdownStyle {
73
+ const output = JSON.parse(JSON.stringify(input));
74
+
75
+ Object.keys(output).forEach((key) => {
76
+ const obj = output[key];
77
+ Object.keys(obj).forEach((prop) => {
78
+ // TODO: use ReactNativeStyleAttributes from 'react-native/Libraries/Components/View/ReactNativeStyleAttributes'
79
+ if (!(prop === 'color' || prop.endsWith('Color'))) {
80
+ return;
81
+ }
82
+ obj[prop] = processColor(obj[prop]);
83
+ });
84
+ });
85
+
86
+ return output as MarkdownStyle;
87
+ }
88
+
89
+ function processMarkdownStyle(input: PartialMarkdownStyle | undefined): MarkdownStyle {
90
+ return processColorsInMarkdownStyle(mergeMarkdownStyleWithDefault(input));
91
+ }
92
+
93
+ interface MarkdownTextInputProps extends TextInputProps {
94
+ markdownStyle?: PartialMarkdownStyle;
95
+ }
96
+
97
+ const MarkdownTextInput = React.forwardRef<TextInput, MarkdownTextInputProps>((props, ref) => {
98
+ const IS_FABRIC = 'nativeFabricUIManager' in global;
99
+
100
+ const markdownStyle = React.useMemo(() => processMarkdownStyle(props.markdownStyle), [props.markdownStyle]);
101
+
102
+ return (
103
+ <>
104
+ <TextInput
105
+ {...props}
106
+ ref={ref}
107
+ />
108
+ <MarkdownTextInputDecoratorViewNativeComponent
109
+ style={IS_FABRIC ? styles.farAway : styles.displayNone}
110
+ markdownStyle={markdownStyle}
111
+ />
112
+ </>
113
+ );
114
+ });
115
+
116
+ const styles = StyleSheet.create({
117
+ displayNone: {
118
+ display: 'none',
119
+ },
120
+ farAway: {
121
+ position: 'absolute',
122
+ top: 1e8,
123
+ left: 1e8,
124
+ },
125
+ });
126
+
127
+ export type {PartialMarkdownStyle as MarkdownStyle, MarkdownTextInputProps};
128
+
129
+ export default MarkdownTextInput;
@@ -0,0 +1,24 @@
1
+ import {TextInput} from 'react-native';
2
+
3
+ import React from 'react';
4
+ import type {TextInputProps} from 'react-native';
5
+
6
+ // eslint-disable-next-line @typescript-eslint/no-empty-interface
7
+ interface MarkdownTextInputProps extends TextInputProps {
8
+ // nothing here
9
+ }
10
+
11
+ // eslint-disable-next-line arrow-body-style
12
+ const MarkdownTextInput = React.forwardRef<TextInput, MarkdownTextInputProps>((props, ref) => {
13
+ // TODO: add web implementation here
14
+ return (
15
+ <TextInput
16
+ {...props}
17
+ ref={ref}
18
+ />
19
+ );
20
+ });
21
+
22
+ export default MarkdownTextInput;
23
+
24
+ export type {MarkdownTextInputProps};
@@ -0,0 +1,48 @@
1
+ import type {ColorValue, ViewProps} from 'react-native';
2
+
3
+ import type {Float} from 'react-native/Libraries/Types/CodegenTypes';
4
+ import codegenNativeComponent from 'react-native/Libraries/Utilities/codegenNativeComponent';
5
+
6
+ interface MarkdownStyle {
7
+ syntax: {
8
+ color: ColorValue;
9
+ };
10
+ link: {
11
+ color: ColorValue;
12
+ };
13
+ h1: {
14
+ fontSize: Float;
15
+ };
16
+ blockquote: {
17
+ borderColor: ColorValue;
18
+ borderWidth: Float;
19
+ marginLeft: Float;
20
+ paddingLeft: Float;
21
+ };
22
+ code: {
23
+ fontFamily: string;
24
+ color: ColorValue;
25
+ backgroundColor: ColorValue;
26
+ };
27
+ pre: {
28
+ fontFamily: string;
29
+ color: ColorValue;
30
+ backgroundColor: ColorValue;
31
+ };
32
+ mentionHere: {
33
+ color: ColorValue;
34
+ backgroundColor: ColorValue;
35
+ };
36
+ mentionUser: {
37
+ color: ColorValue;
38
+ backgroundColor: ColorValue;
39
+ };
40
+ }
41
+
42
+ interface NativeProps extends ViewProps {
43
+ markdownStyle: MarkdownStyle;
44
+ }
45
+
46
+ export default codegenNativeComponent<NativeProps>('MarkdownTextInputDecoratorView');
47
+
48
+ export type {MarkdownStyle};
package/src/index.tsx ADDED
@@ -0,0 +1,2 @@
1
+ export {default as MarkdownTextInput} from './MarkdownTextInput';
2
+ export type {MarkdownTextInputProps, MarkdownStyle} from './MarkdownTextInput';