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.
- package/README.md +90 -8
- package/android/build.gradle +1 -0
- package/android/consumer-rules.pro +8 -0
- package/android/generated/java/com/facebook/react/viewmanagers/EnrichedMarkdownTextManagerDelegate.java +17 -2
- package/android/generated/java/com/facebook/react/viewmanagers/EnrichedMarkdownTextManagerInterface.java +6 -1
- package/android/generated/jni/react/renderer/components/EnrichedMarkdownTextSpec/EventEmitters.cpp +9 -0
- package/android/generated/jni/react/renderer/components/EnrichedMarkdownTextSpec/EventEmitters.h +6 -0
- package/android/generated/jni/react/renderer/components/EnrichedMarkdownTextSpec/Props.cpp +28 -3
- package/android/generated/jni/react/renderer/components/EnrichedMarkdownTextSpec/Props.h +225 -1
- package/android/src/main/baseline-prof.txt +32 -3
- package/android/src/main/cpp/jni-adapter.cpp +28 -11
- package/android/src/main/java/com/swmansion/enriched/markdown/EnrichedMarkdownText.kt +132 -15
- package/android/src/main/java/com/swmansion/enriched/markdown/EnrichedMarkdownTextLayoutManager.kt +1 -16
- package/android/src/main/java/com/swmansion/enriched/markdown/EnrichedMarkdownTextManager.kt +67 -13
- package/android/src/main/java/com/swmansion/enriched/markdown/MeasurementStore.kt +241 -21
- package/android/src/main/java/com/swmansion/enriched/markdown/accessibility/MarkdownAccessibilityHelper.kt +279 -0
- package/android/src/main/java/com/swmansion/enriched/markdown/events/LinkLongPressEvent.kt +23 -0
- package/android/src/main/java/com/swmansion/enriched/markdown/parser/MarkdownASTNode.kt +2 -0
- package/android/src/main/java/com/swmansion/enriched/markdown/parser/Parser.kt +17 -3
- package/android/src/main/java/com/swmansion/enriched/markdown/renderer/BlockquoteRenderer.kt +13 -18
- package/android/src/main/java/com/swmansion/enriched/markdown/renderer/CodeBlockRenderer.kt +23 -24
- package/android/src/main/java/com/swmansion/enriched/markdown/renderer/CodeRenderer.kt +1 -0
- package/android/src/main/java/com/swmansion/enriched/markdown/renderer/DocumentRenderer.kt +2 -1
- package/android/src/main/java/com/swmansion/enriched/markdown/renderer/EmphasisRenderer.kt +2 -1
- package/android/src/main/java/com/swmansion/enriched/markdown/renderer/HeadingRenderer.kt +18 -2
- package/android/src/main/java/com/swmansion/enriched/markdown/renderer/ImageRenderer.kt +22 -6
- package/android/src/main/java/com/swmansion/enriched/markdown/renderer/LineBreakRenderer.kt +1 -0
- package/android/src/main/java/com/swmansion/enriched/markdown/renderer/LinkRenderer.kt +3 -2
- package/android/src/main/java/com/swmansion/enriched/markdown/renderer/ListItemRenderer.kt +2 -1
- package/android/src/main/java/com/swmansion/enriched/markdown/renderer/ListRenderer.kt +16 -9
- package/android/src/main/java/com/swmansion/enriched/markdown/renderer/NodeRenderer.kt +5 -1
- package/android/src/main/java/com/swmansion/enriched/markdown/renderer/ParagraphRenderer.kt +23 -9
- package/android/src/main/java/com/swmansion/enriched/markdown/renderer/Renderer.kt +24 -10
- package/android/src/main/java/com/swmansion/enriched/markdown/renderer/SpanStyleCache.kt +1 -0
- package/android/src/main/java/com/swmansion/enriched/markdown/renderer/StrikethroughRenderer.kt +27 -0
- package/android/src/main/java/com/swmansion/enriched/markdown/renderer/StrongRenderer.kt +2 -1
- package/android/src/main/java/com/swmansion/enriched/markdown/renderer/TextRenderer.kt +1 -0
- package/android/src/main/java/com/swmansion/enriched/markdown/renderer/ThematicBreakRenderer.kt +1 -0
- package/android/src/main/java/com/swmansion/enriched/markdown/renderer/UnderlineRenderer.kt +27 -0
- package/android/src/main/java/com/swmansion/enriched/markdown/spans/ImageSpan.kt +1 -0
- package/android/src/main/java/com/swmansion/enriched/markdown/spans/LineHeightSpan.kt +8 -17
- package/android/src/main/java/com/swmansion/enriched/markdown/spans/LinkSpan.kt +19 -5
- package/android/src/main/java/com/swmansion/enriched/markdown/spans/MarginBottomSpan.kt +1 -1
- package/android/src/main/java/com/swmansion/enriched/markdown/spans/StrikethroughSpan.kt +12 -0
- package/android/src/main/java/com/swmansion/enriched/markdown/styles/BaseBlockStyle.kt +1 -0
- package/android/src/main/java/com/swmansion/enriched/markdown/styles/BlockquoteStyle.kt +3 -0
- package/android/src/main/java/com/swmansion/enriched/markdown/styles/CodeBlockStyle.kt +3 -0
- package/android/src/main/java/com/swmansion/enriched/markdown/styles/HeadingStyle.kt +5 -1
- package/android/src/main/java/com/swmansion/enriched/markdown/styles/ImageStyle.kt +3 -1
- package/android/src/main/java/com/swmansion/enriched/markdown/styles/ListStyle.kt +3 -0
- package/android/src/main/java/com/swmansion/enriched/markdown/styles/ParagraphStyle.kt +5 -1
- package/android/src/main/java/com/swmansion/enriched/markdown/styles/StrikethroughStyle.kt +17 -0
- package/android/src/main/java/com/swmansion/enriched/markdown/styles/StyleConfig.kt +32 -1
- package/android/src/main/java/com/swmansion/enriched/markdown/styles/StyleParser.kt +22 -5
- package/android/src/main/java/com/swmansion/enriched/markdown/styles/TextAlignment.kt +32 -0
- package/android/src/main/java/com/swmansion/enriched/markdown/styles/UnderlineStyle.kt +17 -0
- package/android/src/main/java/com/swmansion/enriched/markdown/utils/HTMLGenerator.kt +23 -5
- package/android/src/main/java/com/swmansion/enriched/markdown/utils/LinkLongPressMovementMethod.kt +121 -0
- package/android/src/main/java/com/swmansion/enriched/markdown/utils/MarkdownExtractor.kt +10 -0
- package/android/src/main/java/com/swmansion/enriched/markdown/utils/Utils.kt +58 -56
- package/android/src/main/jni/CMakeLists.txt +1 -13
- package/android/src/main/jni/react/renderer/components/EnrichedMarkdownTextSpec/MarkdownTextShadowNode.cpp +0 -13
- package/android/src/main/jni/react/renderer/components/EnrichedMarkdownTextSpec/MarkdownTextShadowNode.h +2 -14
- package/android/src/main/jni/react/renderer/components/EnrichedMarkdownTextSpec/conversions.h +3 -0
- package/cpp/parser/MD4CParser.cpp +21 -8
- package/cpp/parser/MD4CParser.hpp +5 -1
- package/cpp/parser/MarkdownASTNode.hpp +2 -0
- package/ios/EnrichedMarkdownText.mm +356 -29
- package/ios/attachments/{ImageAttachment.h → EnrichedMarkdownImageAttachment.h} +1 -1
- package/ios/attachments/{ImageAttachment.m → EnrichedMarkdownImageAttachment.m} +4 -4
- package/ios/generated/EnrichedMarkdownTextSpec/EventEmitters.cpp +9 -0
- package/ios/generated/EnrichedMarkdownTextSpec/EventEmitters.h +6 -0
- package/ios/generated/EnrichedMarkdownTextSpec/Props.cpp +28 -3
- package/ios/generated/EnrichedMarkdownTextSpec/Props.h +225 -1
- package/ios/parser/MarkdownASTNode.h +2 -0
- package/ios/parser/MarkdownParser.h +9 -0
- package/ios/parser/MarkdownParser.mm +31 -2
- package/ios/parser/MarkdownParserBridge.mm +13 -3
- package/ios/renderer/AttributedRenderer.h +2 -0
- package/ios/renderer/AttributedRenderer.m +52 -19
- package/ios/renderer/BlockquoteRenderer.m +7 -6
- package/ios/renderer/CodeBlockRenderer.m +9 -8
- package/ios/renderer/HeadingRenderer.m +31 -24
- package/ios/renderer/ImageRenderer.m +31 -10
- package/ios/renderer/ListItemRenderer.m +51 -39
- package/ios/renderer/ListRenderer.m +21 -18
- package/ios/renderer/ParagraphRenderer.m +27 -16
- package/ios/renderer/RenderContext.h +17 -0
- package/ios/renderer/RenderContext.m +66 -2
- package/ios/renderer/RendererFactory.m +6 -0
- package/ios/renderer/StrikethroughRenderer.h +6 -0
- package/ios/renderer/StrikethroughRenderer.m +40 -0
- package/ios/renderer/UnderlineRenderer.h +6 -0
- package/ios/renderer/UnderlineRenderer.m +39 -0
- package/ios/styles/StyleConfig.h +46 -0
- package/ios/styles/StyleConfig.mm +351 -12
- package/ios/utils/AccessibilityInfo.h +35 -0
- package/ios/utils/AccessibilityInfo.m +24 -0
- package/ios/utils/CodeBlockBackground.m +4 -9
- package/ios/utils/FontUtils.h +5 -0
- package/ios/utils/FontUtils.m +14 -0
- package/ios/utils/HTMLGenerator.m +21 -7
- package/ios/utils/MarkdownAccessibilityElementBuilder.h +45 -0
- package/ios/utils/MarkdownAccessibilityElementBuilder.m +323 -0
- package/ios/utils/MarkdownExtractor.m +18 -5
- package/ios/utils/ParagraphStyleUtils.h +10 -2
- package/ios/utils/ParagraphStyleUtils.m +57 -2
- package/ios/utils/PasteboardUtils.h +1 -1
- package/ios/utils/PasteboardUtils.m +3 -3
- package/lib/module/EnrichedMarkdownText.js +33 -2
- package/lib/module/EnrichedMarkdownText.js.map +1 -1
- package/lib/module/EnrichedMarkdownTextNativeComponent.ts +83 -3
- package/lib/module/index.js +0 -1
- package/lib/module/index.js.map +1 -1
- package/lib/module/normalizeMarkdownStyle.js +58 -14
- package/lib/module/normalizeMarkdownStyle.js.map +1 -1
- package/lib/typescript/src/EnrichedMarkdownText.d.ts +85 -3
- package/lib/typescript/src/EnrichedMarkdownText.d.ts.map +1 -1
- package/lib/typescript/src/EnrichedMarkdownTextNativeComponent.d.ts +75 -1
- package/lib/typescript/src/EnrichedMarkdownTextNativeComponent.d.ts.map +1 -1
- package/lib/typescript/src/index.d.ts +2 -3
- package/lib/typescript/src/index.d.ts.map +1 -1
- package/lib/typescript/src/normalizeMarkdownStyle.d.ts.map +1 -1
- package/package.json +1 -1
- package/src/EnrichedMarkdownText.tsx +133 -5
- package/src/EnrichedMarkdownTextNativeComponent.ts +83 -3
- package/src/index.tsx +5 -2
- package/src/normalizeMarkdownStyle.ts +46 -0
- package/android/src/main/jni/react/renderer/components/EnrichedMarkdownTextSpec/MarkdownTextState.cpp +0 -9
- 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/
|
|
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.
|
|
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
|
-
|
|
|
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 | `` | 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`
|
|
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={(
|
|
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
|
-
| `
|
|
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
|
|
package/android/build.gradle
CHANGED
|
@@ -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 "
|
|
33
|
-
mViewManager.
|
|
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
|
|
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
|
}
|
package/android/generated/jni/react/renderer/components/EnrichedMarkdownTextSpec/EventEmitters.cpp
CHANGED
|
@@ -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
|
package/android/generated/jni/react/renderer/components/EnrichedMarkdownTextSpec/EventEmitters.h
CHANGED
|
@@ -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
|
-
|
|
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 (
|
|
51
|
-
result["
|
|
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
|
}
|