react-native-enriched-markdown 0.1.0 → 0.2.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.
Files changed (226) hide show
  1. package/LICENSE +20 -0
  2. package/README.md +551 -0
  3. package/ReactNativeEnrichedMarkdown.podspec +27 -0
  4. package/android/build.gradle +101 -0
  5. package/android/generated/java/com/facebook/react/viewmanagers/EnrichedMarkdownTextManagerDelegate.java +54 -0
  6. package/android/generated/java/com/facebook/react/viewmanagers/EnrichedMarkdownTextManagerInterface.java +26 -0
  7. package/android/generated/jni/react/renderer/components/EnrichedMarkdownTextSpec/ComponentDescriptors.cpp +22 -0
  8. package/android/generated/jni/react/renderer/components/EnrichedMarkdownTextSpec/ComponentDescriptors.h +24 -0
  9. package/android/generated/jni/react/renderer/components/EnrichedMarkdownTextSpec/EventEmitters.cpp +33 -0
  10. package/android/generated/jni/react/renderer/components/EnrichedMarkdownTextSpec/EventEmitters.h +31 -0
  11. package/android/generated/jni/react/renderer/components/EnrichedMarkdownTextSpec/Props.cpp +82 -0
  12. package/android/generated/jni/react/renderer/components/EnrichedMarkdownTextSpec/Props.h +1388 -0
  13. package/android/generated/jni/react/renderer/components/EnrichedMarkdownTextSpec/ShadowNodes.cpp +17 -0
  14. package/android/generated/jni/react/renderer/components/EnrichedMarkdownTextSpec/ShadowNodes.h +32 -0
  15. package/android/generated/jni/react/renderer/components/EnrichedMarkdownTextSpec/States.cpp +16 -0
  16. package/android/generated/jni/react/renderer/components/EnrichedMarkdownTextSpec/States.h +20 -0
  17. package/android/gradle.properties +5 -0
  18. package/android/src/main/AndroidManifest.xml +2 -0
  19. package/android/src/main/baseline-prof.txt +65 -0
  20. package/android/src/main/cpp/jni-adapter.cpp +220 -0
  21. package/android/src/main/java/com/swmansion/enriched/markdown/EnrichedMarkdownText.kt +270 -0
  22. package/android/src/main/java/com/swmansion/enriched/markdown/EnrichedMarkdownTextLayoutManager.kt +15 -0
  23. package/android/src/main/java/com/swmansion/enriched/markdown/EnrichedMarkdownTextManager.kt +173 -0
  24. package/android/src/main/java/com/swmansion/enriched/markdown/EnrichedMarkdownTextPackage.kt +17 -0
  25. package/android/src/main/java/com/swmansion/enriched/markdown/MeasurementStore.kt +385 -0
  26. package/android/src/main/java/com/swmansion/enriched/markdown/accessibility/MarkdownAccessibilityHelper.kt +279 -0
  27. package/android/src/main/java/com/swmansion/enriched/markdown/events/LinkLongPressEvent.kt +23 -0
  28. package/android/src/main/java/com/swmansion/enriched/markdown/events/LinkPressEvent.kt +23 -0
  29. package/android/src/main/java/com/swmansion/enriched/markdown/parser/MarkdownASTNode.kt +31 -0
  30. package/android/src/main/java/com/swmansion/enriched/markdown/parser/Parser.kt +62 -0
  31. package/android/src/main/java/com/swmansion/enriched/markdown/renderer/BlockStyleContext.kt +166 -0
  32. package/android/src/main/java/com/swmansion/enriched/markdown/renderer/BlockquoteRenderer.kt +84 -0
  33. package/android/src/main/java/com/swmansion/enriched/markdown/renderer/CodeBlockRenderer.kt +104 -0
  34. package/android/src/main/java/com/swmansion/enriched/markdown/renderer/CodeRenderer.kt +36 -0
  35. package/android/src/main/java/com/swmansion/enriched/markdown/renderer/DocumentRenderer.kt +16 -0
  36. package/android/src/main/java/com/swmansion/enriched/markdown/renderer/EmphasisRenderer.kt +27 -0
  37. package/android/src/main/java/com/swmansion/enriched/markdown/renderer/HeadingRenderer.kt +70 -0
  38. package/android/src/main/java/com/swmansion/enriched/markdown/renderer/ImageRenderer.kt +68 -0
  39. package/android/src/main/java/com/swmansion/enriched/markdown/renderer/LineBreakRenderer.kt +16 -0
  40. package/android/src/main/java/com/swmansion/enriched/markdown/renderer/LinkRenderer.kt +29 -0
  41. package/android/src/main/java/com/swmansion/enriched/markdown/renderer/ListContextManager.kt +105 -0
  42. package/android/src/main/java/com/swmansion/enriched/markdown/renderer/ListItemRenderer.kt +59 -0
  43. package/android/src/main/java/com/swmansion/enriched/markdown/renderer/ListRenderer.kt +76 -0
  44. package/android/src/main/java/com/swmansion/enriched/markdown/renderer/NodeRenderer.kt +103 -0
  45. package/android/src/main/java/com/swmansion/enriched/markdown/renderer/ParagraphRenderer.kt +80 -0
  46. package/android/src/main/java/com/swmansion/enriched/markdown/renderer/Renderer.kt +109 -0
  47. package/android/src/main/java/com/swmansion/enriched/markdown/renderer/SpanStyleCache.kt +86 -0
  48. package/android/src/main/java/com/swmansion/enriched/markdown/renderer/StrikethroughRenderer.kt +27 -0
  49. package/android/src/main/java/com/swmansion/enriched/markdown/renderer/StrongRenderer.kt +27 -0
  50. package/android/src/main/java/com/swmansion/enriched/markdown/renderer/TextRenderer.kt +30 -0
  51. package/android/src/main/java/com/swmansion/enriched/markdown/renderer/ThematicBreakRenderer.kt +45 -0
  52. package/android/src/main/java/com/swmansion/enriched/markdown/renderer/UnderlineRenderer.kt +27 -0
  53. package/android/src/main/java/com/swmansion/enriched/markdown/spans/BaseListSpan.kt +136 -0
  54. package/android/src/main/java/com/swmansion/enriched/markdown/spans/BlockquoteSpan.kt +135 -0
  55. package/android/src/main/java/com/swmansion/enriched/markdown/spans/CodeBackgroundSpan.kt +180 -0
  56. package/android/src/main/java/com/swmansion/enriched/markdown/spans/CodeBlockSpan.kt +196 -0
  57. package/android/src/main/java/com/swmansion/enriched/markdown/spans/CodeSpan.kt +27 -0
  58. package/android/src/main/java/com/swmansion/enriched/markdown/spans/EmphasisSpan.kt +34 -0
  59. package/android/src/main/java/com/swmansion/enriched/markdown/spans/HeadingSpan.kt +38 -0
  60. package/android/src/main/java/com/swmansion/enriched/markdown/spans/ImageSpan.kt +321 -0
  61. package/android/src/main/java/com/swmansion/enriched/markdown/spans/LineHeightSpan.kt +27 -0
  62. package/android/src/main/java/com/swmansion/enriched/markdown/spans/LinkSpan.kt +51 -0
  63. package/android/src/main/java/com/swmansion/enriched/markdown/spans/MarginBottomSpan.kt +76 -0
  64. package/android/src/main/java/com/swmansion/enriched/markdown/spans/OrderedListSpan.kt +87 -0
  65. package/android/src/main/java/com/swmansion/enriched/markdown/spans/StrikethroughSpan.kt +12 -0
  66. package/android/src/main/java/com/swmansion/enriched/markdown/spans/StrongSpan.kt +37 -0
  67. package/android/src/main/java/com/swmansion/enriched/markdown/spans/TextSpan.kt +26 -0
  68. package/android/src/main/java/com/swmansion/enriched/markdown/spans/ThematicBreakSpan.kt +69 -0
  69. package/android/src/main/java/com/swmansion/enriched/markdown/spans/UnorderedListSpan.kt +69 -0
  70. package/android/src/main/java/com/swmansion/enriched/markdown/styles/BaseBlockStyle.kt +11 -0
  71. package/android/src/main/java/com/swmansion/enriched/markdown/styles/BlockquoteStyle.kt +51 -0
  72. package/android/src/main/java/com/swmansion/enriched/markdown/styles/CodeBlockStyle.kt +54 -0
  73. package/android/src/main/java/com/swmansion/enriched/markdown/styles/CodeStyle.kt +21 -0
  74. package/android/src/main/java/com/swmansion/enriched/markdown/styles/EmphasisStyle.kt +17 -0
  75. package/android/src/main/java/com/swmansion/enriched/markdown/styles/HeadingStyle.kt +33 -0
  76. package/android/src/main/java/com/swmansion/enriched/markdown/styles/ImageStyle.kt +23 -0
  77. package/android/src/main/java/com/swmansion/enriched/markdown/styles/InlineImageStyle.kt +17 -0
  78. package/android/src/main/java/com/swmansion/enriched/markdown/styles/LinkStyle.kt +19 -0
  79. package/android/src/main/java/com/swmansion/enriched/markdown/styles/ListStyle.kt +57 -0
  80. package/android/src/main/java/com/swmansion/enriched/markdown/styles/ParagraphStyle.kt +33 -0
  81. package/android/src/main/java/com/swmansion/enriched/markdown/styles/StrikethroughStyle.kt +17 -0
  82. package/android/src/main/java/com/swmansion/enriched/markdown/styles/StrongStyle.kt +17 -0
  83. package/android/src/main/java/com/swmansion/enriched/markdown/styles/StyleConfig.kt +211 -0
  84. package/android/src/main/java/com/swmansion/enriched/markdown/styles/StyleParser.kt +92 -0
  85. package/android/src/main/java/com/swmansion/enriched/markdown/styles/TextAlignment.kt +32 -0
  86. package/android/src/main/java/com/swmansion/enriched/markdown/styles/ThematicBreakStyle.kt +23 -0
  87. package/android/src/main/java/com/swmansion/enriched/markdown/styles/UnderlineStyle.kt +17 -0
  88. package/android/src/main/java/com/swmansion/enriched/markdown/utils/AsyncDrawable.kt +91 -0
  89. package/android/src/main/java/com/swmansion/enriched/markdown/utils/HTMLGenerator.kt +827 -0
  90. package/android/src/main/java/com/swmansion/enriched/markdown/utils/LinkLongPressMovementMethod.kt +121 -0
  91. package/android/src/main/java/com/swmansion/enriched/markdown/utils/MarkdownExtractor.kt +375 -0
  92. package/android/src/main/java/com/swmansion/enriched/markdown/utils/SelectionActionMode.kt +139 -0
  93. package/android/src/main/java/com/swmansion/enriched/markdown/utils/Utils.kt +183 -0
  94. package/android/src/main/jni/CMakeLists.txt +70 -0
  95. package/android/src/main/jni/EnrichedMarkdownTextSpec.cpp +21 -0
  96. package/android/src/main/jni/EnrichedMarkdownTextSpec.h +25 -0
  97. package/android/src/main/jni/react/renderer/components/EnrichedMarkdownTextSpec/MarkdownTextComponentDescriptor.h +29 -0
  98. package/android/src/main/jni/react/renderer/components/EnrichedMarkdownTextSpec/MarkdownTextMeasurementManager.cpp +45 -0
  99. package/android/src/main/jni/react/renderer/components/EnrichedMarkdownTextSpec/MarkdownTextMeasurementManager.h +21 -0
  100. package/android/src/main/jni/react/renderer/components/EnrichedMarkdownTextSpec/MarkdownTextShadowNode.cpp +20 -0
  101. package/android/src/main/jni/react/renderer/components/EnrichedMarkdownTextSpec/MarkdownTextShadowNode.h +37 -0
  102. package/android/src/main/jni/react/renderer/components/EnrichedMarkdownTextSpec/conversions.h +22 -0
  103. package/cpp/md4c/md4c.c +6492 -0
  104. package/cpp/md4c/md4c.h +402 -0
  105. package/cpp/parser/MD4CParser.cpp +327 -0
  106. package/cpp/parser/MD4CParser.hpp +27 -0
  107. package/cpp/parser/MarkdownASTNode.hpp +51 -0
  108. package/ios/EnrichedMarkdownText.h +18 -0
  109. package/ios/EnrichedMarkdownText.mm +1401 -0
  110. package/ios/attachments/EnrichedMarkdownImageAttachment.h +23 -0
  111. package/ios/attachments/EnrichedMarkdownImageAttachment.m +185 -0
  112. package/ios/attachments/ThematicBreakAttachment.h +15 -0
  113. package/ios/attachments/ThematicBreakAttachment.m +33 -0
  114. package/ios/generated/EnrichedMarkdownTextSpec/ComponentDescriptors.cpp +22 -0
  115. package/ios/generated/EnrichedMarkdownTextSpec/ComponentDescriptors.h +24 -0
  116. package/ios/generated/EnrichedMarkdownTextSpec/EventEmitters.cpp +33 -0
  117. package/ios/generated/EnrichedMarkdownTextSpec/EventEmitters.h +31 -0
  118. package/ios/generated/EnrichedMarkdownTextSpec/Props.cpp +82 -0
  119. package/ios/generated/EnrichedMarkdownTextSpec/Props.h +1388 -0
  120. package/ios/generated/EnrichedMarkdownTextSpec/RCTComponentViewHelpers.h +20 -0
  121. package/ios/generated/EnrichedMarkdownTextSpec/ShadowNodes.cpp +17 -0
  122. package/ios/generated/EnrichedMarkdownTextSpec/ShadowNodes.h +32 -0
  123. package/ios/generated/EnrichedMarkdownTextSpec/States.cpp +16 -0
  124. package/ios/generated/EnrichedMarkdownTextSpec/States.h +20 -0
  125. package/ios/internals/EnrichedMarkdownTextComponentDescriptor.h +19 -0
  126. package/ios/internals/EnrichedMarkdownTextShadowNode.h +43 -0
  127. package/ios/internals/EnrichedMarkdownTextShadowNode.mm +85 -0
  128. package/ios/internals/EnrichedMarkdownTextState.h +24 -0
  129. package/ios/parser/MarkdownASTNode.h +35 -0
  130. package/ios/parser/MarkdownASTNode.m +32 -0
  131. package/ios/parser/MarkdownParser.h +17 -0
  132. package/ios/parser/MarkdownParser.mm +42 -0
  133. package/ios/parser/MarkdownParserBridge.mm +120 -0
  134. package/ios/renderer/AttributedRenderer.h +11 -0
  135. package/ios/renderer/AttributedRenderer.m +152 -0
  136. package/ios/renderer/BlockquoteRenderer.h +7 -0
  137. package/ios/renderer/BlockquoteRenderer.m +160 -0
  138. package/ios/renderer/CodeBlockRenderer.h +10 -0
  139. package/ios/renderer/CodeBlockRenderer.m +90 -0
  140. package/ios/renderer/CodeRenderer.h +10 -0
  141. package/ios/renderer/CodeRenderer.m +60 -0
  142. package/ios/renderer/EmphasisRenderer.h +6 -0
  143. package/ios/renderer/EmphasisRenderer.m +96 -0
  144. package/ios/renderer/HeadingRenderer.h +7 -0
  145. package/ios/renderer/HeadingRenderer.m +105 -0
  146. package/ios/renderer/ImageRenderer.h +12 -0
  147. package/ios/renderer/ImageRenderer.m +83 -0
  148. package/ios/renderer/LinkRenderer.h +7 -0
  149. package/ios/renderer/LinkRenderer.m +69 -0
  150. package/ios/renderer/ListItemRenderer.h +16 -0
  151. package/ios/renderer/ListItemRenderer.m +103 -0
  152. package/ios/renderer/ListRenderer.h +13 -0
  153. package/ios/renderer/ListRenderer.m +70 -0
  154. package/ios/renderer/NodeRenderer.h +8 -0
  155. package/ios/renderer/ParagraphRenderer.h +7 -0
  156. package/ios/renderer/ParagraphRenderer.m +80 -0
  157. package/ios/renderer/RenderContext.h +105 -0
  158. package/ios/renderer/RenderContext.m +312 -0
  159. package/ios/renderer/RendererFactory.h +12 -0
  160. package/ios/renderer/RendererFactory.m +116 -0
  161. package/ios/renderer/StrikethroughRenderer.h +6 -0
  162. package/ios/renderer/StrikethroughRenderer.m +40 -0
  163. package/ios/renderer/StrongRenderer.h +6 -0
  164. package/ios/renderer/StrongRenderer.m +83 -0
  165. package/ios/renderer/TextRenderer.h +6 -0
  166. package/ios/renderer/TextRenderer.m +16 -0
  167. package/ios/renderer/ThematicBreakRenderer.h +5 -0
  168. package/ios/renderer/ThematicBreakRenderer.m +53 -0
  169. package/ios/renderer/UnderlineRenderer.h +6 -0
  170. package/ios/renderer/UnderlineRenderer.m +39 -0
  171. package/ios/styles/StyleConfig.h +274 -0
  172. package/ios/styles/StyleConfig.mm +1806 -0
  173. package/ios/utils/AccessibilityInfo.h +35 -0
  174. package/ios/utils/AccessibilityInfo.m +24 -0
  175. package/ios/utils/BlockquoteBorder.h +20 -0
  176. package/ios/utils/BlockquoteBorder.m +92 -0
  177. package/ios/utils/CodeBackground.h +19 -0
  178. package/ios/utils/CodeBackground.m +191 -0
  179. package/ios/utils/CodeBlockBackground.h +17 -0
  180. package/ios/utils/CodeBlockBackground.m +82 -0
  181. package/ios/utils/EditMenuUtils.h +22 -0
  182. package/ios/utils/EditMenuUtils.m +118 -0
  183. package/ios/utils/FontUtils.h +25 -0
  184. package/ios/utils/FontUtils.m +27 -0
  185. package/ios/utils/HTMLGenerator.h +20 -0
  186. package/ios/utils/HTMLGenerator.m +793 -0
  187. package/ios/utils/LastElementUtils.h +53 -0
  188. package/ios/utils/ListMarkerDrawer.h +15 -0
  189. package/ios/utils/ListMarkerDrawer.m +127 -0
  190. package/ios/utils/MarkdownAccessibilityElementBuilder.h +45 -0
  191. package/ios/utils/MarkdownAccessibilityElementBuilder.m +323 -0
  192. package/ios/utils/MarkdownExtractor.h +17 -0
  193. package/ios/utils/MarkdownExtractor.m +308 -0
  194. package/ios/utils/ParagraphStyleUtils.h +21 -0
  195. package/ios/utils/ParagraphStyleUtils.m +111 -0
  196. package/ios/utils/PasteboardUtils.h +36 -0
  197. package/ios/utils/PasteboardUtils.m +134 -0
  198. package/ios/utils/RTFExportUtils.h +24 -0
  199. package/ios/utils/RTFExportUtils.m +297 -0
  200. package/ios/utils/RuntimeKeys.h +38 -0
  201. package/ios/utils/RuntimeKeys.m +11 -0
  202. package/ios/utils/TextViewLayoutManager.h +14 -0
  203. package/ios/utils/TextViewLayoutManager.mm +113 -0
  204. package/lib/module/EnrichedMarkdownText.js +65 -0
  205. package/lib/module/EnrichedMarkdownText.js.map +1 -0
  206. package/lib/module/EnrichedMarkdownTextNativeComponent.ts +210 -0
  207. package/lib/module/index.js +4 -0
  208. package/lib/module/index.js.map +1 -0
  209. package/lib/module/normalizeMarkdownStyle.js +384 -0
  210. package/lib/module/normalizeMarkdownStyle.js.map +1 -0
  211. package/lib/module/package.json +1 -0
  212. package/lib/typescript/package.json +1 -0
  213. package/lib/typescript/src/EnrichedMarkdownText.d.ts +183 -0
  214. package/lib/typescript/src/EnrichedMarkdownText.d.ts.map +1 -0
  215. package/lib/typescript/src/EnrichedMarkdownTextNativeComponent.d.ts +185 -0
  216. package/lib/typescript/src/EnrichedMarkdownTextNativeComponent.d.ts.map +1 -0
  217. package/lib/typescript/src/index.d.ts +4 -0
  218. package/lib/typescript/src/index.d.ts.map +1 -0
  219. package/lib/typescript/src/normalizeMarkdownStyle.d.ts +6 -0
  220. package/lib/typescript/src/normalizeMarkdownStyle.d.ts.map +1 -0
  221. package/package.json +186 -1
  222. package/react-native.config.js +13 -0
  223. package/src/EnrichedMarkdownText.tsx +280 -0
  224. package/src/EnrichedMarkdownTextNativeComponent.ts +210 -0
  225. package/src/index.tsx +10 -0
  226. package/src/normalizeMarkdownStyle.ts +423 -0
@@ -0,0 +1,280 @@
1
+ import { useMemo, useCallback } from 'react';
2
+ import EnrichedMarkdownTextNativeComponent, {
3
+ type NativeProps,
4
+ type LinkPressEvent,
5
+ type LinkLongPressEvent,
6
+ } from './EnrichedMarkdownTextNativeComponent';
7
+ import { normalizeMarkdownStyle } from './normalizeMarkdownStyle';
8
+ import type { ViewStyle, TextStyle, NativeSyntheticEvent } from 'react-native';
9
+
10
+ type TextAlign = 'auto' | 'left' | 'right' | 'center' | 'justify';
11
+
12
+ interface BaseBlockStyle {
13
+ fontSize?: number;
14
+ fontFamily?: string;
15
+ fontWeight?: string;
16
+ color?: string;
17
+ marginTop?: number;
18
+ marginBottom?: number;
19
+ lineHeight?: number;
20
+ }
21
+
22
+ interface ParagraphStyle extends BaseBlockStyle {
23
+ textAlign?: TextAlign;
24
+ }
25
+
26
+ interface HeadingStyle extends BaseBlockStyle {
27
+ textAlign?: TextAlign;
28
+ }
29
+
30
+ interface BlockquoteStyle extends BaseBlockStyle {
31
+ borderColor?: string;
32
+ borderWidth?: number;
33
+ gapWidth?: number;
34
+ backgroundColor?: string;
35
+ }
36
+
37
+ interface ListStyle extends BaseBlockStyle {
38
+ bulletColor?: string;
39
+ bulletSize?: number;
40
+ markerColor?: string;
41
+ markerFontWeight?: string;
42
+ gapWidth?: number;
43
+ marginLeft?: number;
44
+ }
45
+
46
+ interface CodeBlockStyle extends BaseBlockStyle {
47
+ backgroundColor?: string;
48
+ borderColor?: string;
49
+ borderRadius?: number;
50
+ borderWidth?: number;
51
+ padding?: number;
52
+ }
53
+
54
+ interface LinkStyle {
55
+ color?: string;
56
+ underline?: boolean;
57
+ }
58
+
59
+ interface StrongStyle {
60
+ color?: string;
61
+ }
62
+
63
+ interface EmphasisStyle {
64
+ color?: string;
65
+ }
66
+
67
+ interface StrikethroughStyle {
68
+ /**
69
+ * Color of the strikethrough line.
70
+ * @platform iOS
71
+ */
72
+ color?: string;
73
+ }
74
+
75
+ interface UnderlineStyle {
76
+ /**
77
+ * Color of the underline.
78
+ * @platform iOS
79
+ */
80
+ color?: string;
81
+ }
82
+
83
+ interface CodeStyle {
84
+ color?: string;
85
+ backgroundColor?: string;
86
+ borderColor?: string;
87
+ }
88
+
89
+ interface ImageStyle {
90
+ height?: number;
91
+ borderRadius?: number;
92
+ marginTop?: number;
93
+ marginBottom?: number;
94
+ }
95
+
96
+ interface InlineImageStyle {
97
+ size?: number;
98
+ }
99
+
100
+ interface ThematicBreakStyle {
101
+ color?: string;
102
+ height?: number;
103
+ marginTop?: number;
104
+ marginBottom?: number;
105
+ }
106
+
107
+ export interface MarkdownStyle {
108
+ paragraph?: ParagraphStyle;
109
+ h1?: HeadingStyle;
110
+ h2?: HeadingStyle;
111
+ h3?: HeadingStyle;
112
+ h4?: HeadingStyle;
113
+ h5?: HeadingStyle;
114
+ h6?: HeadingStyle;
115
+ blockquote?: BlockquoteStyle;
116
+ list?: ListStyle;
117
+ codeBlock?: CodeBlockStyle;
118
+ link?: LinkStyle;
119
+ strong?: StrongStyle;
120
+ em?: EmphasisStyle;
121
+ strikethrough?: StrikethroughStyle;
122
+ underline?: UnderlineStyle;
123
+ code?: CodeStyle;
124
+ image?: ImageStyle;
125
+ inlineImage?: InlineImageStyle;
126
+ thematicBreak?: ThematicBreakStyle;
127
+ }
128
+
129
+ /**
130
+ * MD4C parser flags configuration.
131
+ * Controls how the markdown parser interprets certain syntax.
132
+ */
133
+ export interface Md4cFlags {
134
+ /**
135
+ * Enable underline syntax support (__text__).
136
+ * When enabled, underscores are treated as underline markers.
137
+ * When disabled, underscores are treated as emphasis markers (same as asterisks).
138
+ * @default false
139
+ */
140
+ underline?: boolean;
141
+ }
142
+
143
+ export interface EnrichedMarkdownTextProps
144
+ extends Omit<
145
+ NativeProps,
146
+ | 'markdownStyle'
147
+ | 'style'
148
+ | 'onLinkPress'
149
+ | 'onLinkLongPress'
150
+ | 'md4cFlags'
151
+ | 'enableLinkPreview'
152
+ > {
153
+ /**
154
+ * Style configuration for markdown elements
155
+ */
156
+ markdownStyle?: MarkdownStyle;
157
+ /**
158
+ * Style for the container view.
159
+ */
160
+ containerStyle?: ViewStyle | TextStyle;
161
+ /**
162
+ * Callback fired when a link is pressed.
163
+ * Receives the link URL directly.
164
+ */
165
+ onLinkPress?: (event: LinkPressEvent) => void;
166
+ /**
167
+ * Callback fired when a link is long pressed.
168
+ * Receives the link URL directly.
169
+ * - iOS: When provided, automatically disables the system link preview (unless `enableLinkPreview` is explicitly set to `true`).
170
+ * - Android: Handles long press gestures on links.
171
+ */
172
+ onLinkLongPress?: (event: LinkLongPressEvent) => void;
173
+ /**
174
+ * Controls whether the system link preview is shown on long press (iOS only).
175
+ *
176
+ * When `true`, long-pressing a link shows the native iOS link preview.
177
+ * When `false`, the system preview is suppressed.
178
+ *
179
+ * Defaults to `true`, but automatically becomes `false` when `onLinkLongPress` is provided.
180
+ * Set explicitly to override the automatic behavior.
181
+ *
182
+ * Android: No-op.
183
+ *
184
+ * @default true
185
+ * @platform ios
186
+ */
187
+ enableLinkPreview?: boolean;
188
+ /**
189
+ * MD4C parser flags configuration.
190
+ * Controls how the markdown parser interprets certain syntax.
191
+ */
192
+ md4cFlags?: Md4cFlags;
193
+ /**
194
+ * Specifies whether fonts should scale to respect Text Size accessibility settings.
195
+ * When false, text will not scale with the user's accessibility settings.
196
+ * @default true
197
+ */
198
+ allowFontScaling?: boolean;
199
+ /**
200
+ * Specifies the largest possible scale a font can reach when allowFontScaling is enabled.
201
+ * Possible values:
202
+ * - undefined/null (default): no limit
203
+ * - 0: no limit
204
+ * - >= 1: sets the maxFontSizeMultiplier of this node to this value
205
+ * @default undefined
206
+ */
207
+ maxFontSizeMultiplier?: number;
208
+ /**
209
+ * When false (default), removes trailing margin from the last element to eliminate bottom spacing.
210
+ * When true, keeps the trailing margin from the last element's marginBottom style.
211
+ * @default false
212
+ */
213
+ allowTrailingMargin?: boolean;
214
+ }
215
+
216
+ const defaultMd4cFlags: Md4cFlags = {
217
+ underline: false,
218
+ };
219
+
220
+ export const EnrichedMarkdownText = ({
221
+ markdown,
222
+ markdownStyle = {},
223
+ containerStyle,
224
+ onLinkPress,
225
+ onLinkLongPress,
226
+ enableLinkPreview,
227
+ selectable = true,
228
+ md4cFlags = defaultMd4cFlags,
229
+ allowFontScaling = true,
230
+ maxFontSizeMultiplier,
231
+ allowTrailingMargin = false,
232
+ ...rest
233
+ }: EnrichedMarkdownTextProps) => {
234
+ const normalizedStyle = useMemo(
235
+ () => normalizeMarkdownStyle(markdownStyle),
236
+ [markdownStyle]
237
+ );
238
+
239
+ const normalizedMd4cFlags = useMemo(
240
+ () => ({
241
+ underline: md4cFlags.underline ?? false,
242
+ }),
243
+ [md4cFlags]
244
+ );
245
+
246
+ const handleLinkPress = useCallback(
247
+ (e: NativeSyntheticEvent<LinkPressEvent>) => {
248
+ const { url } = e.nativeEvent;
249
+ onLinkPress?.({ url });
250
+ },
251
+ [onLinkPress]
252
+ );
253
+
254
+ const handleLinkLongPress = useCallback(
255
+ (e: NativeSyntheticEvent<LinkLongPressEvent>) => {
256
+ const { url } = e.nativeEvent;
257
+ onLinkLongPress?.({ url });
258
+ },
259
+ [onLinkLongPress]
260
+ );
261
+
262
+ return (
263
+ <EnrichedMarkdownTextNativeComponent
264
+ markdown={markdown}
265
+ markdownStyle={normalizedStyle}
266
+ onLinkPress={handleLinkPress}
267
+ onLinkLongPress={handleLinkLongPress}
268
+ enableLinkPreview={onLinkLongPress == null && (enableLinkPreview ?? true)}
269
+ selectable={selectable}
270
+ md4cFlags={normalizedMd4cFlags}
271
+ allowFontScaling={allowFontScaling}
272
+ maxFontSizeMultiplier={maxFontSizeMultiplier}
273
+ allowTrailingMargin={allowTrailingMargin}
274
+ style={containerStyle}
275
+ {...rest}
276
+ />
277
+ );
278
+ };
279
+
280
+ export default EnrichedMarkdownText;
@@ -0,0 +1,210 @@
1
+ import {
2
+ codegenNativeComponent,
3
+ type ViewProps,
4
+ type CodegenTypes,
5
+ type ColorValue,
6
+ } from 'react-native';
7
+
8
+ // All block styles extend this interface
9
+ interface BaseBlockStyleInternal {
10
+ fontSize: CodegenTypes.Float;
11
+ fontFamily: string;
12
+ fontWeight: string;
13
+ color: ColorValue;
14
+ marginTop: CodegenTypes.Float;
15
+ marginBottom: CodegenTypes.Float;
16
+ lineHeight: CodegenTypes.Float;
17
+ }
18
+
19
+ interface ParagraphStyleInternal extends BaseBlockStyleInternal {
20
+ textAlign: string;
21
+ }
22
+
23
+ interface HeadingStyleInternal extends BaseBlockStyleInternal {
24
+ textAlign: string;
25
+ }
26
+
27
+ interface BlockquoteStyleInternal extends BaseBlockStyleInternal {
28
+ borderColor: ColorValue;
29
+ borderWidth: CodegenTypes.Float;
30
+ gapWidth: CodegenTypes.Float;
31
+ backgroundColor: ColorValue;
32
+ }
33
+
34
+ interface ListStyleInternal extends BaseBlockStyleInternal {
35
+ bulletColor: ColorValue;
36
+ bulletSize: CodegenTypes.Float;
37
+ markerColor: ColorValue;
38
+ markerFontWeight: string;
39
+ gapWidth: CodegenTypes.Float;
40
+ marginLeft: CodegenTypes.Float;
41
+ }
42
+
43
+ interface CodeBlockStyleInternal extends BaseBlockStyleInternal {
44
+ backgroundColor: ColorValue;
45
+ borderColor: ColorValue;
46
+ borderRadius: CodegenTypes.Float;
47
+ borderWidth: CodegenTypes.Float;
48
+ padding: CodegenTypes.Float;
49
+ }
50
+
51
+ interface LinkStyleInternal {
52
+ color: ColorValue;
53
+ underline: boolean;
54
+ }
55
+
56
+ interface StrongStyleInternal {
57
+ color?: ColorValue;
58
+ }
59
+
60
+ interface EmphasisStyleInternal {
61
+ color?: ColorValue;
62
+ }
63
+
64
+ interface StrikethroughStyleInternal {
65
+ color: ColorValue;
66
+ }
67
+
68
+ interface UnderlineStyleInternal {
69
+ color: ColorValue;
70
+ }
71
+
72
+ interface CodeStyleInternal {
73
+ color: ColorValue;
74
+ backgroundColor: ColorValue;
75
+ borderColor: ColorValue;
76
+ }
77
+
78
+ interface ImageStyleInternal {
79
+ height: CodegenTypes.Float;
80
+ borderRadius: CodegenTypes.Float;
81
+ marginTop: CodegenTypes.Float;
82
+ marginBottom: CodegenTypes.Float;
83
+ }
84
+
85
+ interface InlineImageStyleInternal {
86
+ size: CodegenTypes.Float;
87
+ }
88
+
89
+ interface ThematicBreakStyleInternal {
90
+ color: ColorValue;
91
+ height: CodegenTypes.Float;
92
+ marginTop: CodegenTypes.Float;
93
+ marginBottom: CodegenTypes.Float;
94
+ }
95
+
96
+ export interface MarkdownStyleInternal {
97
+ paragraph: ParagraphStyleInternal;
98
+ h1: HeadingStyleInternal;
99
+ h2: HeadingStyleInternal;
100
+ h3: HeadingStyleInternal;
101
+ h4: HeadingStyleInternal;
102
+ h5: HeadingStyleInternal;
103
+ h6: HeadingStyleInternal;
104
+ blockquote: BlockquoteStyleInternal;
105
+ list: ListStyleInternal;
106
+ codeBlock: CodeBlockStyleInternal;
107
+ link: LinkStyleInternal;
108
+ strong: StrongStyleInternal;
109
+ em: EmphasisStyleInternal;
110
+ strikethrough: StrikethroughStyleInternal;
111
+ underline: UnderlineStyleInternal;
112
+ code: CodeStyleInternal;
113
+ image: ImageStyleInternal;
114
+ inlineImage: InlineImageStyleInternal;
115
+ thematicBreak: ThematicBreakStyleInternal;
116
+ }
117
+
118
+ export interface LinkPressEvent {
119
+ url: string;
120
+ }
121
+
122
+ export interface LinkLongPressEvent {
123
+ url: string;
124
+ }
125
+
126
+ /**
127
+ * MD4C parser flags configuration.
128
+ * Controls how the markdown parser interprets certain syntax.
129
+ */
130
+ export interface Md4cFlagsInternal {
131
+ /**
132
+ * Enable underline syntax support (__text__).
133
+ * When enabled, underscores are treated as underline markers.
134
+ * When disabled, underscores are treated as emphasis markers (same as asterisks).
135
+ * @default false
136
+ */
137
+ underline: boolean;
138
+ }
139
+
140
+ export interface NativeProps extends ViewProps {
141
+ /**
142
+ * Markdown content to render.
143
+ */
144
+ markdown: string;
145
+ /**
146
+ * Internal style configuration for markdown elements.
147
+ * Always provided with complete defaults via normalizeMarkdownStyle.
148
+ * Block styles (paragraph, headings) contain fontSize, fontFamily, fontWeight, and color.
149
+ */
150
+ markdownStyle: MarkdownStyleInternal;
151
+ /**
152
+ * Callback fired when a link is pressed.
153
+ * Receives the URL that was tapped.
154
+ */
155
+ onLinkPress?: CodegenTypes.BubblingEventHandler<LinkPressEvent>;
156
+ /**
157
+ * Callback fired when a link is long pressed.
158
+ * Receives the URL that was long pressed.
159
+ * - iOS: When provided, overrides the system link preview behavior.
160
+ * - Android: Handles long press gestures on links.
161
+ */
162
+ onLinkLongPress?: CodegenTypes.BubblingEventHandler<LinkLongPressEvent>;
163
+ /**
164
+ * Controls whether the system link preview is shown on long press (iOS only).
165
+ *
166
+ * When `true` (default), long-pressing a link shows the native iOS link preview.
167
+ * When `false`, the system preview is suppressed.
168
+ *
169
+ * Automatically set to `false` when `onLinkLongPress` is provided (unless explicitly overridden).
170
+ *
171
+ * Android: No-op (Android doesn't have a system link preview).
172
+ *
173
+ * @default true
174
+ */
175
+ enableLinkPreview?: CodegenTypes.WithDefault<boolean, true>;
176
+ /**
177
+ * - iOS: Controls text selection and link previews on long press.
178
+ * - Android: Controls text selection.
179
+ * @default true
180
+ */
181
+ selectable?: boolean;
182
+ /**
183
+ * MD4C parser flags configuration.
184
+ * Controls how the markdown parser interprets certain syntax.
185
+ */
186
+ md4cFlags: Md4cFlagsInternal;
187
+ /**
188
+ * Specifies whether fonts should scale to respect Text Size accessibility settings.
189
+ * When false, text will not scale with the user's accessibility settings.
190
+ * @default true
191
+ */
192
+ allowFontScaling?: CodegenTypes.WithDefault<boolean, true>;
193
+ /**
194
+ * Specifies the largest possible scale a font can reach when allowFontScaling is enabled.
195
+ * Possible values:
196
+ * - undefined/null (default): inherit from parent or global default (no limit)
197
+ * - 0: no limit, ignore parent/global default
198
+ * - >= 1: sets the maxFontSizeMultiplier of this node to this value
199
+ * @default undefined
200
+ */
201
+ maxFontSizeMultiplier?: CodegenTypes.Float;
202
+ /**
203
+ * When false (default), removes trailing margin from the last element to eliminate bottom spacing.
204
+ * When true, keeps the trailing margin from the last element's marginBottom style.
205
+ * @default false
206
+ */
207
+ allowTrailingMargin?: CodegenTypes.WithDefault<boolean, false>;
208
+ }
209
+
210
+ export default codegenNativeComponent<NativeProps>('EnrichedMarkdownText');
package/src/index.tsx ADDED
@@ -0,0 +1,10 @@
1
+ export { default as EnrichedMarkdownText } from './EnrichedMarkdownText';
2
+ export type {
3
+ EnrichedMarkdownTextProps,
4
+ MarkdownStyle,
5
+ Md4cFlags,
6
+ } from './EnrichedMarkdownText';
7
+ export type {
8
+ LinkPressEvent,
9
+ LinkLongPressEvent,
10
+ } from './EnrichedMarkdownTextNativeComponent';