react-native-enriched-markdown 0.1.1 → 0.2.1

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 (130) hide show
  1. package/README.md +90 -8
  2. package/android/build.gradle +1 -0
  3. package/android/consumer-rules.pro +8 -0
  4. package/android/generated/java/com/facebook/react/viewmanagers/EnrichedMarkdownTextManagerDelegate.java +17 -2
  5. package/android/generated/java/com/facebook/react/viewmanagers/EnrichedMarkdownTextManagerInterface.java +6 -1
  6. package/android/generated/jni/react/renderer/components/EnrichedMarkdownTextSpec/EventEmitters.cpp +9 -0
  7. package/android/generated/jni/react/renderer/components/EnrichedMarkdownTextSpec/EventEmitters.h +6 -0
  8. package/android/generated/jni/react/renderer/components/EnrichedMarkdownTextSpec/Props.cpp +28 -3
  9. package/android/generated/jni/react/renderer/components/EnrichedMarkdownTextSpec/Props.h +225 -1
  10. package/android/src/main/baseline-prof.txt +32 -3
  11. package/android/src/main/cpp/jni-adapter.cpp +28 -11
  12. package/android/src/main/java/com/swmansion/enriched/markdown/EnrichedMarkdownText.kt +132 -15
  13. package/android/src/main/java/com/swmansion/enriched/markdown/EnrichedMarkdownTextLayoutManager.kt +1 -16
  14. package/android/src/main/java/com/swmansion/enriched/markdown/EnrichedMarkdownTextManager.kt +67 -13
  15. package/android/src/main/java/com/swmansion/enriched/markdown/MeasurementStore.kt +241 -21
  16. package/android/src/main/java/com/swmansion/enriched/markdown/accessibility/MarkdownAccessibilityHelper.kt +279 -0
  17. package/android/src/main/java/com/swmansion/enriched/markdown/events/LinkLongPressEvent.kt +23 -0
  18. package/android/src/main/java/com/swmansion/enriched/markdown/parser/MarkdownASTNode.kt +2 -0
  19. package/android/src/main/java/com/swmansion/enriched/markdown/parser/Parser.kt +17 -3
  20. package/android/src/main/java/com/swmansion/enriched/markdown/renderer/BlockquoteRenderer.kt +13 -18
  21. package/android/src/main/java/com/swmansion/enriched/markdown/renderer/CodeBlockRenderer.kt +23 -24
  22. package/android/src/main/java/com/swmansion/enriched/markdown/renderer/CodeRenderer.kt +1 -0
  23. package/android/src/main/java/com/swmansion/enriched/markdown/renderer/DocumentRenderer.kt +2 -1
  24. package/android/src/main/java/com/swmansion/enriched/markdown/renderer/EmphasisRenderer.kt +2 -1
  25. package/android/src/main/java/com/swmansion/enriched/markdown/renderer/HeadingRenderer.kt +18 -2
  26. package/android/src/main/java/com/swmansion/enriched/markdown/renderer/ImageRenderer.kt +22 -6
  27. package/android/src/main/java/com/swmansion/enriched/markdown/renderer/LineBreakRenderer.kt +1 -0
  28. package/android/src/main/java/com/swmansion/enriched/markdown/renderer/LinkRenderer.kt +3 -2
  29. package/android/src/main/java/com/swmansion/enriched/markdown/renderer/ListItemRenderer.kt +2 -1
  30. package/android/src/main/java/com/swmansion/enriched/markdown/renderer/ListRenderer.kt +16 -9
  31. package/android/src/main/java/com/swmansion/enriched/markdown/renderer/NodeRenderer.kt +5 -1
  32. package/android/src/main/java/com/swmansion/enriched/markdown/renderer/ParagraphRenderer.kt +23 -9
  33. package/android/src/main/java/com/swmansion/enriched/markdown/renderer/Renderer.kt +24 -10
  34. package/android/src/main/java/com/swmansion/enriched/markdown/renderer/SpanStyleCache.kt +1 -0
  35. package/android/src/main/java/com/swmansion/enriched/markdown/renderer/StrikethroughRenderer.kt +27 -0
  36. package/android/src/main/java/com/swmansion/enriched/markdown/renderer/StrongRenderer.kt +2 -1
  37. package/android/src/main/java/com/swmansion/enriched/markdown/renderer/TextRenderer.kt +1 -0
  38. package/android/src/main/java/com/swmansion/enriched/markdown/renderer/ThematicBreakRenderer.kt +1 -0
  39. package/android/src/main/java/com/swmansion/enriched/markdown/renderer/UnderlineRenderer.kt +27 -0
  40. package/android/src/main/java/com/swmansion/enriched/markdown/spans/ImageSpan.kt +1 -0
  41. package/android/src/main/java/com/swmansion/enriched/markdown/spans/LineHeightSpan.kt +8 -17
  42. package/android/src/main/java/com/swmansion/enriched/markdown/spans/LinkSpan.kt +19 -5
  43. package/android/src/main/java/com/swmansion/enriched/markdown/spans/MarginBottomSpan.kt +1 -1
  44. package/android/src/main/java/com/swmansion/enriched/markdown/spans/StrikethroughSpan.kt +12 -0
  45. package/android/src/main/java/com/swmansion/enriched/markdown/styles/BaseBlockStyle.kt +1 -0
  46. package/android/src/main/java/com/swmansion/enriched/markdown/styles/BlockquoteStyle.kt +3 -0
  47. package/android/src/main/java/com/swmansion/enriched/markdown/styles/CodeBlockStyle.kt +3 -0
  48. package/android/src/main/java/com/swmansion/enriched/markdown/styles/HeadingStyle.kt +5 -1
  49. package/android/src/main/java/com/swmansion/enriched/markdown/styles/ImageStyle.kt +3 -1
  50. package/android/src/main/java/com/swmansion/enriched/markdown/styles/ListStyle.kt +3 -0
  51. package/android/src/main/java/com/swmansion/enriched/markdown/styles/ParagraphStyle.kt +5 -1
  52. package/android/src/main/java/com/swmansion/enriched/markdown/styles/StrikethroughStyle.kt +17 -0
  53. package/android/src/main/java/com/swmansion/enriched/markdown/styles/StyleConfig.kt +32 -1
  54. package/android/src/main/java/com/swmansion/enriched/markdown/styles/StyleParser.kt +22 -5
  55. package/android/src/main/java/com/swmansion/enriched/markdown/styles/TextAlignment.kt +32 -0
  56. package/android/src/main/java/com/swmansion/enriched/markdown/styles/UnderlineStyle.kt +17 -0
  57. package/android/src/main/java/com/swmansion/enriched/markdown/utils/HTMLGenerator.kt +23 -5
  58. package/android/src/main/java/com/swmansion/enriched/markdown/utils/LinkLongPressMovementMethod.kt +121 -0
  59. package/android/src/main/java/com/swmansion/enriched/markdown/utils/MarkdownExtractor.kt +10 -0
  60. package/android/src/main/java/com/swmansion/enriched/markdown/utils/Utils.kt +58 -56
  61. package/android/src/main/jni/CMakeLists.txt +1 -13
  62. package/android/src/main/jni/react/renderer/components/EnrichedMarkdownTextSpec/MarkdownTextShadowNode.cpp +0 -13
  63. package/android/src/main/jni/react/renderer/components/EnrichedMarkdownTextSpec/MarkdownTextShadowNode.h +2 -14
  64. package/android/src/main/jni/react/renderer/components/EnrichedMarkdownTextSpec/conversions.h +3 -0
  65. package/cpp/parser/MD4CParser.cpp +21 -8
  66. package/cpp/parser/MD4CParser.hpp +5 -1
  67. package/cpp/parser/MarkdownASTNode.hpp +2 -0
  68. package/ios/EnrichedMarkdownText.mm +356 -29
  69. package/ios/attachments/{ImageAttachment.h → EnrichedMarkdownImageAttachment.h} +1 -1
  70. package/ios/attachments/{ImageAttachment.m → EnrichedMarkdownImageAttachment.m} +4 -4
  71. package/ios/generated/EnrichedMarkdownTextSpec/EventEmitters.cpp +9 -0
  72. package/ios/generated/EnrichedMarkdownTextSpec/EventEmitters.h +6 -0
  73. package/ios/generated/EnrichedMarkdownTextSpec/Props.cpp +28 -3
  74. package/ios/generated/EnrichedMarkdownTextSpec/Props.h +225 -1
  75. package/ios/parser/MarkdownASTNode.h +2 -0
  76. package/ios/parser/MarkdownParser.h +9 -0
  77. package/ios/parser/MarkdownParser.mm +31 -2
  78. package/ios/parser/MarkdownParserBridge.mm +13 -3
  79. package/ios/renderer/AttributedRenderer.h +2 -0
  80. package/ios/renderer/AttributedRenderer.m +52 -19
  81. package/ios/renderer/BlockquoteRenderer.m +7 -6
  82. package/ios/renderer/CodeBlockRenderer.m +9 -8
  83. package/ios/renderer/HeadingRenderer.m +31 -24
  84. package/ios/renderer/ImageRenderer.m +31 -10
  85. package/ios/renderer/ListItemRenderer.m +51 -39
  86. package/ios/renderer/ListRenderer.m +21 -18
  87. package/ios/renderer/ParagraphRenderer.m +27 -16
  88. package/ios/renderer/RenderContext.h +17 -0
  89. package/ios/renderer/RenderContext.m +66 -2
  90. package/ios/renderer/RendererFactory.m +6 -0
  91. package/ios/renderer/StrikethroughRenderer.h +6 -0
  92. package/ios/renderer/StrikethroughRenderer.m +40 -0
  93. package/ios/renderer/UnderlineRenderer.h +6 -0
  94. package/ios/renderer/UnderlineRenderer.m +39 -0
  95. package/ios/styles/StyleConfig.h +46 -0
  96. package/ios/styles/StyleConfig.mm +351 -12
  97. package/ios/utils/AccessibilityInfo.h +35 -0
  98. package/ios/utils/AccessibilityInfo.m +24 -0
  99. package/ios/utils/CodeBlockBackground.m +4 -9
  100. package/ios/utils/FontUtils.h +5 -0
  101. package/ios/utils/FontUtils.m +14 -0
  102. package/ios/utils/HTMLGenerator.m +21 -7
  103. package/ios/utils/MarkdownAccessibilityElementBuilder.h +45 -0
  104. package/ios/utils/MarkdownAccessibilityElementBuilder.m +323 -0
  105. package/ios/utils/MarkdownExtractor.m +18 -5
  106. package/ios/utils/ParagraphStyleUtils.h +10 -2
  107. package/ios/utils/ParagraphStyleUtils.m +57 -2
  108. package/ios/utils/PasteboardUtils.h +1 -1
  109. package/ios/utils/PasteboardUtils.m +3 -3
  110. package/lib/module/EnrichedMarkdownText.js +33 -2
  111. package/lib/module/EnrichedMarkdownText.js.map +1 -1
  112. package/lib/module/EnrichedMarkdownTextNativeComponent.ts +83 -3
  113. package/lib/module/index.js +0 -1
  114. package/lib/module/index.js.map +1 -1
  115. package/lib/module/normalizeMarkdownStyle.js +58 -14
  116. package/lib/module/normalizeMarkdownStyle.js.map +1 -1
  117. package/lib/typescript/src/EnrichedMarkdownText.d.ts +85 -3
  118. package/lib/typescript/src/EnrichedMarkdownText.d.ts.map +1 -1
  119. package/lib/typescript/src/EnrichedMarkdownTextNativeComponent.d.ts +75 -1
  120. package/lib/typescript/src/EnrichedMarkdownTextNativeComponent.d.ts.map +1 -1
  121. package/lib/typescript/src/index.d.ts +2 -3
  122. package/lib/typescript/src/index.d.ts.map +1 -1
  123. package/lib/typescript/src/normalizeMarkdownStyle.d.ts.map +1 -1
  124. package/package.json +1 -1
  125. package/src/EnrichedMarkdownText.tsx +133 -5
  126. package/src/EnrichedMarkdownTextNativeComponent.ts +83 -3
  127. package/src/index.tsx +5 -2
  128. package/src/normalizeMarkdownStyle.ts +46 -0
  129. package/android/src/main/jni/react/renderer/components/EnrichedMarkdownTextSpec/MarkdownTextState.cpp +0 -9
  130. package/android/src/main/jni/react/renderer/components/EnrichedMarkdownTextSpec/MarkdownTextState.h +0 -25
package/README.md CHANGED
@@ -1,4 +1,4 @@
1
- <img src="https://github.com/user-attachments/assets/76e00153-6ae6-4a1a-bbbb-a8f7646aa1b5" alt="react-native-enriched-markdown by Software Mansion" width="100%">
1
+ <img src="https://github.com/user-attachments/assets/922e57b6-98b7-4ad4-a270-838c7341d102" alt="react-native-enriched-markdown by Software Mansion" width="100%">
2
2
 
3
3
  # react-native-enriched-markdown
4
4
 
@@ -14,6 +14,7 @@
14
14
  - 🔗 Interactive link handling
15
15
  - 🖼️ Native image interactions (iOS: Copy, Save to Camera Roll)
16
16
  - 🌐 Native platform features (Translate, Look Up, Search Web, Share)
17
+ - 🗣️ Accessibility support (VoiceOver & TalkBack)
17
18
 
18
19
  Since 2012 [Software Mansion](https://swmansion.com) is a software agency with experience in building web and mobile apps. We are Core React Native Contributors and experts in dealing with all kinds of React Native issues.
19
20
  We can help you build your next dream product –
@@ -27,16 +28,18 @@ We can help you build your next dream product –
27
28
  - [Supported Markdown Elements](#supported-markdown-elements)
28
29
  - [Link Handling](#link-handling)
29
30
  - [Copy Options](#copy-options)
31
+ - [Accessibility](#accessibility)
30
32
  - [Styling Architecture](#styling-architecture)
31
33
  - [Customizing Styles](#customizing-styles)
32
34
  - [API Reference](#api-reference)
33
35
  - [Contributing](#contributing)
36
+ - [Future Plans](#future-plans)
34
37
  - [License](#license)
35
38
 
36
39
  ## Prerequisites
37
40
 
38
41
  - `react-native-enriched-markdown` currently supports only Android and iOS platforms
39
- - It works only with [the React Native New Architecture (Fabric)](https://reactnative.dev/architecture/landing-page) and supports following React Native releases: `0.81`, `0.82` and `0.83`
42
+ - It works only with [the React Native New Architecture (Fabric)](https://reactnative.dev/architecture/landing-page) and supports following React Native releases: `0.81`, `0.82`, `0.83` and `0.84`
40
43
 
41
44
  ## Installation
42
45
 
@@ -144,11 +147,15 @@ export default function App() {
144
147
  |---------|--------|-------------|
145
148
  | Bold | `**text**` or `__text__` | Strong emphasis |
146
149
  | Italic | `*text*` or `_text_` | Emphasis |
147
- | Bold + Italic | `***text***`, `___text___`, `**_text_**`, `__*text*__`, `_**text**_`, `*__text__*` | Combined emphasis |
150
+ | Underline | `_text_` | Underlined text (requires `md4cFlags`) |
151
+ | Strikethrough | `~~text~~` | Strikethrough text |
152
+ | Bold + Italic | `***text***`, `___text___`, etc. | Combined emphasis |
148
153
  | Links | `[text](url)` | Clickable links |
149
154
  | Inline Code | `` `code` `` | Inline code snippets |
150
155
  | Inline Images | `![alt](url)` | Images within text flow |
151
156
 
157
+ > **Note:** Underscore syntax (`__text__`, `_text_`) works for bold/italic by default. Enable underline via `md4cFlags={{ underline: true }}` to treat `_text_` as underline instead of emphasis.
158
+
152
159
  ### Nested Lists Example
153
160
 
154
161
  ```markdown
@@ -174,16 +181,32 @@ export default function App() {
174
181
 
175
182
  ## Link Handling
176
183
 
177
- Links in Markdown are interactive and can be handled with the `onLinkPress` callback:
184
+ Links in Markdown are interactive and can be handled with the `onLinkPress` and `onLinkLongPress` callbacks:
178
185
 
179
186
  ```tsx
180
187
  <EnrichedMarkdownText
181
188
  markdown="Check out [React Native](https://reactnative.dev)!"
182
- onLinkPress={(event) => {
183
- const { url } = event.nativeEvent;
189
+ onLinkPress={({ url }) => {
184
190
  Alert.alert('Link pressed', url);
185
191
  Linking.openURL(url);
186
192
  }}
193
+ onLinkLongPress={({ url }) => {
194
+ Alert.alert('Link long pressed', url);
195
+ }}
196
+ />
197
+ ```
198
+
199
+ ### Link Preview (iOS)
200
+
201
+ By default, long-pressing a link on iOS shows the native system link preview. When you provide `onLinkLongPress`, the system preview is automatically disabled so your handler can fire instead.
202
+
203
+ You can also control this behavior explicitly with the `enableLinkPreview` prop:
204
+
205
+ ```tsx
206
+ // Disable system link preview without providing a handler
207
+ <EnrichedMarkdownText
208
+ markdown={content}
209
+ enableLinkPreview={false}
187
210
  />
188
211
  ```
189
212
 
@@ -219,6 +242,20 @@ A dedicated **Copy as Markdown** option is available in the context menu on both
219
242
 
220
243
  When selecting text that contains images, a **Copy Image URL** option appears to copy the image's source URL. On Android, if multiple images are selected, all URLs are copied (one per line).
221
244
 
245
+ ## Accessibility
246
+
247
+ `react-native-enriched-markdown` provides accessibility support for screen readers on both platforms — VoiceOver on iOS and TalkBack on Android.
248
+
249
+ ### Supported Elements
250
+
251
+ | Element | VoiceOver (iOS) | TalkBack (Android) |
252
+ |---------|-----------------|---------------------|
253
+ | **Headings (h1-h6)** | Rotor navigation | Reading controls navigation |
254
+ | **Links** | Rotor navigation, activatable | Reading controls navigation, activatable |
255
+ | **Images** | Alt text announced, rotor navigation | Alt text announced |
256
+ | **List items** | Position announced (e.g., "bullet point", "list item 1") | Position announced |
257
+ | **Nested lists** | Proper depth handling | "Nested" prefix for deeper items |
258
+
222
259
  ## Styling Architecture
223
260
 
224
261
  Understanding how `react-native-enriched-markdown` handles styling helps you create consistent, well-designed Markdown content.
@@ -229,7 +266,7 @@ Markdown elements are divided into two categories:
229
266
 
230
267
  #### Block Elements
231
268
 
232
- Block elements are structural containers that define the layout. Each block has its own typography settings (`fontSize`, `fontFamily`, `fontWeight`, `color`, `lineHeight`, `marginBottom`).
269
+ Block elements are structural containers that define the layout. Each block has its own typography settings (`fontSize`, `fontFamily`, `fontWeight`, `color`, `lineHeight`, `marginTop`, `marginBottom`).
233
270
 
234
271
  | Block Type | Description |
235
272
  |------------|-------------|
@@ -247,6 +284,8 @@ Inline elements modify text within blocks. They inherit the parent block's base
247
284
  |-------------|---------------|------|
248
285
  | `strong` | Parent block | Bold weight, optional color |
249
286
  | `em` | Parent block | Italic style, optional color |
287
+ | `strikethrough` | Parent block | Strike line with custom color (iOS only) |
288
+ | `underline` | Parent block | Underline with custom color (iOS only) |
250
289
  | `code` | Parent block | Monospace font, background |
251
290
  | `link` | Parent block | Color, underline |
252
291
 
@@ -306,11 +345,13 @@ The library provides sensible default styles for all Markdown elements out of th
306
345
  fontWeight: 'bold',
307
346
  color: '#000',
308
347
  marginBottom: 16,
348
+ textAlign: 'center',
309
349
  },
310
350
  h2: {
311
351
  fontSize: 24,
312
352
  fontWeight: '600',
313
353
  marginBottom: 12,
354
+ textAlign: 'left',
314
355
  },
315
356
  strong: {
316
357
  color: '#000',
@@ -318,6 +359,12 @@ The library provides sensible default styles for all Markdown elements out of th
318
359
  em: {
319
360
  color: '#666',
320
361
  },
362
+ strikethrough: {
363
+ color: '#999',
364
+ },
365
+ underline: {
366
+ color: '#333',
367
+ },
321
368
  link: {
322
369
  color: '#007AFF',
323
370
  underline: true,
@@ -382,9 +429,16 @@ The library provides sensible default styles for all Markdown elements out of th
382
429
  | `fontFamily` | `string` | Font family name |
383
430
  | `fontWeight` | `string` | Font weight |
384
431
  | `color` | `string` | Text color |
432
+ | `marginTop` | `number` | Top margin |
385
433
  | `marginBottom` | `number` | Bottom margin |
386
434
  | `lineHeight` | `number` | Line height |
387
435
 
436
+ #### Paragraph and Heading-specific (paragraph, h1-h6)
437
+
438
+ | Property | Type | Description |
439
+ |----------|------|-------------|
440
+ | `textAlign` | `'auto' \| 'left' \| 'right' \| 'center' \| 'justify'` | Text alignment (default: `'left'`) |
441
+
388
442
  #### Blockquote-specific
389
443
 
390
444
  | Property | Type | Description |
@@ -430,12 +484,25 @@ The library provides sensible default styles for all Markdown elements out of th
430
484
  | `color` | `string` | Link text color |
431
485
  | `underline` | `boolean` | Show underline |
432
486
 
487
+ #### Strikethrough-specific
488
+
489
+ | Property | Type | Description |
490
+ |----------|------|-------------|
491
+ | `color` | `string` | Strikethrough line color (iOS only) |
492
+
493
+ #### Underline-specific
494
+
495
+ | Property | Type | Description |
496
+ |----------|------|-------------|
497
+ | `color` | `string` | Underline color (iOS only) |
498
+
433
499
  #### Image-specific
434
500
 
435
501
  | Property | Type | Description |
436
502
  |----------|------|-------------|
437
503
  | `height` | `number` | Image height |
438
504
  | `borderRadius` | `number` | Corner radius |
505
+ | `marginTop` | `number` | Top margin |
439
506
  | `marginBottom` | `number` | Bottom margin |
440
507
 
441
508
  #### Inline Image-specific
@@ -463,7 +530,22 @@ The library provides sensible default styles for all Markdown elements out of th
463
530
  | `markdownStyle` | `MarkdownStyle` | `{}` | Style configuration for Markdown elements |
464
531
  | `containerStyle` | `ViewStyle` | - | Style for the container view |
465
532
  | `onLinkPress` | `(event: LinkPressEvent) => void` | - | Callback when a link is pressed. Access URL via `event.url` |
466
- | `isSelectable` | `boolean` | `true` | Whether text can be selected |
533
+ | `onLinkLongPress` | `(event: LinkLongPressEvent) => void` | - | Callback when a link is long pressed. Access URL via `event.url`. On iOS, automatically disables the system link preview |
534
+ | `enableLinkPreview` | `boolean` | `true` | Controls the native link preview on long press (iOS only). Automatically set to `false` when `onLinkLongPress` is provided |
535
+ | `selectable` | `boolean` | `true` | Whether text can be selected |
536
+ | `md4cFlags` | `Md4cFlags` | `{ underline: false }` | Configuration for md4c parser extension flags |
537
+ | `allowFontScaling` | `boolean` | `true` | Whether fonts should scale to respect Text Size accessibility settings |
538
+ | `maxFontSizeMultiplier` | `number` | `undefined` | Maximum font scale multiplier when `allowFontScaling` is enabled |
539
+ | `allowTrailingMargin` | `boolean` | `false` | Whether to preserve the bottom margin of the last block element |
540
+
541
+ ## Future Plans
542
+
543
+ We're actively working on expanding the capabilities of `react-native-enriched-markdown`. Here's what's on the roadmap:
544
+
545
+ - GFM (GitHub Flavored Markdown) Support
546
+ - LaTeX / Math Rendering
547
+ - `EnrichedMarkdownInput`
548
+ - Web Implementation via `react-native-web`
467
549
 
468
550
  ## Contributing
469
551
 
@@ -35,6 +35,7 @@ android {
35
35
  defaultConfig {
36
36
  minSdkVersion getExtOrIntegerDefault("minSdkVersion")
37
37
  targetSdkVersion getExtOrIntegerDefault("targetSdkVersion")
38
+ consumerProguardFiles "consumer-rules.pro"
38
39
  }
39
40
 
40
41
  buildFeatures {
@@ -0,0 +1,8 @@
1
+ # ProGuard/R8 consumer rules for react-native-enriched-markdown
2
+ #
3
+ # JNI: Classes accessed from C++ (jni-adapter.cpp) via FindClass/GetFieldID.
4
+ # R8 cannot trace hardcoded string lookups in native code.
5
+
6
+ -keep class com.swmansion.enriched.markdown.parser.MarkdownASTNode { *; }
7
+ -keep class com.swmansion.enriched.markdown.parser.MarkdownASTNode$NodeType { *; }
8
+ -keep class com.swmansion.enriched.markdown.parser.Md4cFlags { *; }
@@ -29,8 +29,23 @@ public class EnrichedMarkdownTextManagerDelegate<T extends View, U extends BaseV
29
29
  case "markdownStyle":
30
30
  mViewManager.setMarkdownStyle(view, (ReadableMap) value);
31
31
  break;
32
- case "isSelectable":
33
- mViewManager.setIsSelectable(view, value == null ? false : (boolean) value);
32
+ case "enableLinkPreview":
33
+ mViewManager.setEnableLinkPreview(view, value == null ? true : (boolean) value);
34
+ break;
35
+ case "selectable":
36
+ mViewManager.setSelectable(view, value == null ? false : (boolean) value);
37
+ break;
38
+ case "md4cFlags":
39
+ mViewManager.setMd4cFlags(view, (ReadableMap) value);
40
+ break;
41
+ case "allowFontScaling":
42
+ mViewManager.setAllowFontScaling(view, value == null ? true : (boolean) value);
43
+ break;
44
+ case "maxFontSizeMultiplier":
45
+ mViewManager.setMaxFontSizeMultiplier(view, value == null ? 0f : ((Double) value).floatValue());
46
+ break;
47
+ case "allowTrailingMargin":
48
+ mViewManager.setAllowTrailingMargin(view, value == null ? false : (boolean) value);
34
49
  break;
35
50
  default:
36
51
  super.setProperty(view, propName, value);
@@ -17,5 +17,10 @@ import com.facebook.react.uimanager.ViewManagerWithGeneratedInterface;
17
17
  public interface EnrichedMarkdownTextManagerInterface<T extends View> extends ViewManagerWithGeneratedInterface {
18
18
  void setMarkdown(T view, @Nullable String value);
19
19
  void setMarkdownStyle(T view, @Nullable ReadableMap value);
20
- void setIsSelectable(T view, boolean value);
20
+ void setEnableLinkPreview(T view, boolean value);
21
+ void setSelectable(T view, boolean value);
22
+ void setMd4cFlags(T view, @Nullable ReadableMap value);
23
+ void setAllowFontScaling(T view, boolean value);
24
+ void setMaxFontSizeMultiplier(T view, float value);
25
+ void setAllowTrailingMargin(T view, boolean value);
21
26
  }
@@ -21,4 +21,13 @@ void EnrichedMarkdownTextEventEmitter::onLinkPress(OnLinkPress event) const {
21
21
  });
22
22
  }
23
23
 
24
+
25
+ void EnrichedMarkdownTextEventEmitter::onLinkLongPress(OnLinkLongPress event) const {
26
+ dispatchEvent("linkLongPress", [event=std::move(event)](jsi::Runtime &runtime) {
27
+ auto payload = jsi::Object(runtime);
28
+ payload.setProperty(runtime, "url", event.url);
29
+ return payload;
30
+ });
31
+ }
32
+
24
33
  } // namespace facebook::react
@@ -20,6 +20,12 @@ class EnrichedMarkdownTextEventEmitter : public ViewEventEmitter {
20
20
  struct OnLinkPress {
21
21
  std::string url;
22
22
  };
23
+
24
+ struct OnLinkLongPress {
25
+ std::string url;
26
+ };
23
27
  void onLinkPress(OnLinkPress value) const;
28
+
29
+ void onLinkLongPress(OnLinkLongPress value) const;
24
30
  };
25
31
  } // namespace facebook::react
@@ -21,7 +21,12 @@ EnrichedMarkdownTextProps::EnrichedMarkdownTextProps(
21
21
 
22
22
  markdown(convertRawProp(context, rawProps, "markdown", sourceProps.markdown, {})),
23
23
  markdownStyle(convertRawProp(context, rawProps, "markdownStyle", sourceProps.markdownStyle, {})),
24
- isSelectable(convertRawProp(context, rawProps, "isSelectable", sourceProps.isSelectable, {false})) {}
24
+ enableLinkPreview(convertRawProp(context, rawProps, "enableLinkPreview", sourceProps.enableLinkPreview, {true})),
25
+ selectable(convertRawProp(context, rawProps, "selectable", sourceProps.selectable, {false})),
26
+ md4cFlags(convertRawProp(context, rawProps, "md4cFlags", sourceProps.md4cFlags, {})),
27
+ allowFontScaling(convertRawProp(context, rawProps, "allowFontScaling", sourceProps.allowFontScaling, {true})),
28
+ maxFontSizeMultiplier(convertRawProp(context, rawProps, "maxFontSizeMultiplier", sourceProps.maxFontSizeMultiplier, {0.0})),
29
+ allowTrailingMargin(convertRawProp(context, rawProps, "allowTrailingMargin", sourceProps.allowTrailingMargin, {false})) {}
25
30
 
26
31
  #ifdef RN_SERIALIZABLE_STATE
27
32
  ComponentName EnrichedMarkdownTextProps::getDiffPropsImplementationTarget() const {
@@ -47,8 +52,28 @@ folly::dynamic EnrichedMarkdownTextProps::getDiffProps(
47
52
  result["markdownStyle"] = toDynamic(markdownStyle);
48
53
  }
49
54
 
50
- if (isSelectable != oldProps->isSelectable) {
51
- result["isSelectable"] = isSelectable;
55
+ if (enableLinkPreview != oldProps->enableLinkPreview) {
56
+ result["enableLinkPreview"] = enableLinkPreview;
57
+ }
58
+
59
+ if (selectable != oldProps->selectable) {
60
+ result["selectable"] = selectable;
61
+ }
62
+
63
+ if (md4cFlags != oldProps->md4cFlags) {
64
+ result["md4cFlags"] = toDynamic(md4cFlags);
65
+ }
66
+
67
+ if (allowFontScaling != oldProps->allowFontScaling) {
68
+ result["allowFontScaling"] = allowFontScaling;
69
+ }
70
+
71
+ if ((maxFontSizeMultiplier != oldProps->maxFontSizeMultiplier) && !(std::isnan(maxFontSizeMultiplier) && std::isnan(oldProps->maxFontSizeMultiplier))) {
72
+ result["maxFontSizeMultiplier"] = maxFontSizeMultiplier;
73
+ }
74
+
75
+ if (allowTrailingMargin != oldProps->allowTrailingMargin) {
76
+ result["allowTrailingMargin"] = allowTrailingMargin;
52
77
  }
53
78
  return result;
54
79
  }