react-native-enriched-markdown-scaffold 1.0.2-scaffold.1 → 1.0.2-scaffold.2

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 (38) hide show
  1. package/android/generated/jni/react/renderer/components/EnrichedMarkdownTextSpec/Props.h +48 -0
  2. package/android/src/main/java/com/swmansion/enriched/markdown/EnrichedMarkdown.kt +14 -2
  3. package/android/src/main/java/com/swmansion/enriched/markdown/utils/common/MarkdownViewManagerUtils.kt +4 -0
  4. package/android/src/main/java/com/swmansion/enriched/markdown/utils/text/view/SelectionActionMode.kt +30 -13
  5. package/android/src/main/java/com/swmansion/enriched/markdown/views/BlockMenuOptions.kt +45 -0
  6. package/android/src/main/java/com/swmansion/enriched/markdown/views/CodeBlockContainerView.kt +11 -3
  7. package/android/src/main/java/com/swmansion/enriched/markdown/views/TableContainerView.kt +4 -4
  8. package/android/src/math/java/com/swmansion/enriched/markdown/views/MathContainerView.kt +4 -4
  9. package/docs/API_REFERENCE.md +12 -4
  10. package/docs/COPY_OPTIONS.md +26 -0
  11. package/ios/EnrichedMarkdown.mm +22 -8
  12. package/ios/EnrichedMarkdownText.mm +4 -5
  13. package/ios/generated/ReactCodegen/EnrichedMarkdownTextSpec/Props.h +48 -0
  14. package/ios/utils/ENRMBlockMenu.h +57 -0
  15. package/ios/utils/EditMenuUtils.h +22 -5
  16. package/ios/utils/EditMenuUtils.m +36 -13
  17. package/ios/views/ENRMCodeBlockContainerView.h +9 -2
  18. package/ios/views/ENRMCodeBlockContainerView.m +12 -19
  19. package/ios/views/ENRMMathContainerView.h +4 -0
  20. package/ios/views/ENRMMathContainerView.m +4 -19
  21. package/ios/views/TableContainerView.h +4 -0
  22. package/ios/views/TableContainerView.m +6 -20
  23. package/lib/module/EnrichedMarkdownNativeComponent.ts +8 -0
  24. package/lib/module/EnrichedMarkdownTextNativeComponent.ts +8 -0
  25. package/lib/module/native/EnrichedMarkdownText.js +7 -1
  26. package/lib/module/native/EnrichedMarkdownText.js.map +1 -1
  27. package/lib/typescript/src/EnrichedMarkdownNativeComponent.d.ts +4 -0
  28. package/lib/typescript/src/EnrichedMarkdownNativeComponent.d.ts.map +1 -1
  29. package/lib/typescript/src/EnrichedMarkdownTextNativeComponent.d.ts +4 -0
  30. package/lib/typescript/src/EnrichedMarkdownTextNativeComponent.d.ts.map +1 -1
  31. package/lib/typescript/src/native/EnrichedMarkdownText.d.ts.map +1 -1
  32. package/lib/typescript/src/types/MarkdownTextProps.d.ts +40 -9
  33. package/lib/typescript/src/types/MarkdownTextProps.d.ts.map +1 -1
  34. package/package.json +1 -1
  35. package/src/EnrichedMarkdownNativeComponent.ts +8 -0
  36. package/src/EnrichedMarkdownTextNativeComponent.ts +8 -0
  37. package/src/native/EnrichedMarkdownText.tsx +13 -0
  38. package/src/types/MarkdownTextProps.ts +37 -10
@@ -2462,6 +2462,10 @@ struct EnrichedMarkdownSelectionMenuConfigStruct {
2462
2462
  std::string copyImageUrlLabel{};
2463
2463
  std::string copyImageUrlsLabel{};
2464
2464
  std::vector<std::string> copyImageUrlPluralTemplates{};
2465
+ bool copyEnabled{false};
2466
+ bool copyFormatMarkdown{false};
2467
+ bool systemItemsNone{false};
2468
+ bool codeBlockCopyButton{false};
2465
2469
 
2466
2470
 
2467
2471
  #ifdef RN_SERIALIZABLE_STATE
@@ -2476,6 +2480,10 @@ struct EnrichedMarkdownSelectionMenuConfigStruct {
2476
2480
  result["copyImageUrlLabel"] = copyImageUrlLabel;
2477
2481
  result["copyImageUrlsLabel"] = copyImageUrlsLabel;
2478
2482
  result["copyImageUrlPluralTemplates"] = ::facebook::react::toDynamic(copyImageUrlPluralTemplates);
2483
+ result["copyEnabled"] = copyEnabled;
2484
+ result["copyFormatMarkdown"] = copyFormatMarkdown;
2485
+ result["systemItemsNone"] = systemItemsNone;
2486
+ result["codeBlockCopyButton"] = codeBlockCopyButton;
2479
2487
  return result;
2480
2488
  }
2481
2489
  #endif
@@ -2512,6 +2520,22 @@ static inline void fromRawValue(const PropsParserContext& context, const RawValu
2512
2520
  if (tmp_copyImageUrlPluralTemplates != map.end()) {
2513
2521
  fromRawValue(context, tmp_copyImageUrlPluralTemplates->second, result.copyImageUrlPluralTemplates);
2514
2522
  }
2523
+ auto tmp_copyEnabled = map.find("copyEnabled");
2524
+ if (tmp_copyEnabled != map.end()) {
2525
+ fromRawValue(context, tmp_copyEnabled->second, result.copyEnabled);
2526
+ }
2527
+ auto tmp_copyFormatMarkdown = map.find("copyFormatMarkdown");
2528
+ if (tmp_copyFormatMarkdown != map.end()) {
2529
+ fromRawValue(context, tmp_copyFormatMarkdown->second, result.copyFormatMarkdown);
2530
+ }
2531
+ auto tmp_systemItemsNone = map.find("systemItemsNone");
2532
+ if (tmp_systemItemsNone != map.end()) {
2533
+ fromRawValue(context, tmp_systemItemsNone->second, result.systemItemsNone);
2534
+ }
2535
+ auto tmp_codeBlockCopyButton = map.find("codeBlockCopyButton");
2536
+ if (tmp_codeBlockCopyButton != map.end()) {
2537
+ fromRawValue(context, tmp_codeBlockCopyButton->second, result.codeBlockCopyButton);
2538
+ }
2515
2539
  }
2516
2540
 
2517
2541
  static inline std::string toString(const EnrichedMarkdownSelectionMenuConfigStruct &value) {
@@ -6415,6 +6439,10 @@ struct EnrichedMarkdownTextSelectionMenuConfigStruct {
6415
6439
  std::string copyImageUrlLabel{};
6416
6440
  std::string copyImageUrlsLabel{};
6417
6441
  std::vector<std::string> copyImageUrlPluralTemplates{};
6442
+ bool copyEnabled{false};
6443
+ bool copyFormatMarkdown{false};
6444
+ bool systemItemsNone{false};
6445
+ bool codeBlockCopyButton{false};
6418
6446
 
6419
6447
 
6420
6448
  #ifdef RN_SERIALIZABLE_STATE
@@ -6429,6 +6457,10 @@ struct EnrichedMarkdownTextSelectionMenuConfigStruct {
6429
6457
  result["copyImageUrlLabel"] = copyImageUrlLabel;
6430
6458
  result["copyImageUrlsLabel"] = copyImageUrlsLabel;
6431
6459
  result["copyImageUrlPluralTemplates"] = ::facebook::react::toDynamic(copyImageUrlPluralTemplates);
6460
+ result["copyEnabled"] = copyEnabled;
6461
+ result["copyFormatMarkdown"] = copyFormatMarkdown;
6462
+ result["systemItemsNone"] = systemItemsNone;
6463
+ result["codeBlockCopyButton"] = codeBlockCopyButton;
6432
6464
  return result;
6433
6465
  }
6434
6466
  #endif
@@ -6465,6 +6497,22 @@ static inline void fromRawValue(const PropsParserContext& context, const RawValu
6465
6497
  if (tmp_copyImageUrlPluralTemplates != map.end()) {
6466
6498
  fromRawValue(context, tmp_copyImageUrlPluralTemplates->second, result.copyImageUrlPluralTemplates);
6467
6499
  }
6500
+ auto tmp_copyEnabled = map.find("copyEnabled");
6501
+ if (tmp_copyEnabled != map.end()) {
6502
+ fromRawValue(context, tmp_copyEnabled->second, result.copyEnabled);
6503
+ }
6504
+ auto tmp_copyFormatMarkdown = map.find("copyFormatMarkdown");
6505
+ if (tmp_copyFormatMarkdown != map.end()) {
6506
+ fromRawValue(context, tmp_copyFormatMarkdown->second, result.copyFormatMarkdown);
6507
+ }
6508
+ auto tmp_systemItemsNone = map.find("systemItemsNone");
6509
+ if (tmp_systemItemsNone != map.end()) {
6510
+ fromRawValue(context, tmp_systemItemsNone->second, result.systemItemsNone);
6511
+ }
6512
+ auto tmp_codeBlockCopyButton = map.find("codeBlockCopyButton");
6513
+ if (tmp_codeBlockCopyButton != map.end()) {
6514
+ fromRawValue(context, tmp_codeBlockCopyButton->second, result.codeBlockCopyButton);
6515
+ }
6468
6516
  }
6469
6517
 
6470
6518
  static inline std::string toString(const EnrichedMarkdownTextSelectionMenuConfigStruct &value) {
@@ -0,0 +1,57 @@
1
+ #pragma once
2
+ #import "ENRMUIKit.h"
3
+ #include <TargetConditionals.h>
4
+
5
+ NS_ASSUME_NONNULL_BEGIN
6
+
7
+ /// Selection-menu options that table, math and code block views need for their
8
+ /// own long-press menus. Every field is phrased so that the zero value keeps the
9
+ /// legacy behavior, so a block view that has not received options yet behaves
10
+ /// exactly as before.
11
+ typedef struct {
12
+ // `selectionMenuConfig.copy.enabled == false`.
13
+ BOOL copyHidden;
14
+ // `selectionMenuConfig.copy.format == 'markdown'`: the Copy item writes the
15
+ // block's Markdown instead of its raw content.
16
+ BOOL copyWritesMarkdown;
17
+ // `selectionMenuConfig.copyAsMarkdown.enabled == false`.
18
+ BOOL copyAsMarkdownHidden;
19
+ // `selectionMenuConfig.codeBlockCopyButton.enabled == false`.
20
+ BOOL copyButtonHidden;
21
+ } ENRMBlockMenuOptions;
22
+
23
+ #if !TARGET_OS_OSX
24
+ /// Builds the long-press menu shared by the table, math and code block views.
25
+ /// Returns nil when no item is left — nil is how UIKit suppresses a context
26
+ /// menu, whereas an empty menu would still lift the view.
27
+ static inline UIContextMenuConfiguration *_Nullable ENRMBlockContextMenuConfiguration(
28
+ ENRMBlockMenuOptions options, NSString *_Nullable copyLabel, NSString *_Nullable copyAsMarkdownLabel,
29
+ void (^copyRaw)(void), void (^copyMarkdown)(void))
30
+ {
31
+ if (options.copyHidden && options.copyAsMarkdownHidden) {
32
+ return nil;
33
+ }
34
+ void (^copyHandler)(void) = options.copyWritesMarkdown ? copyMarkdown : copyRaw;
35
+ return [UIContextMenuConfiguration
36
+ configurationWithIdentifier:nil
37
+ previewProvider:nil
38
+ actionProvider:^UIMenu *(NSArray<UIMenuElement *> *suggestedActions) {
39
+ NSMutableArray<UIMenuElement *> *children = [NSMutableArray arrayWithCapacity:2];
40
+ if (!options.copyHidden) {
41
+ [children addObject:[UIAction actionWithTitle:copyLabel ?: @""
42
+ image:[RCTUIImage systemImageNamed:@"doc.on.doc"]
43
+ identifier:nil
44
+ handler:^(__kindof UIAction *action) { copyHandler(); }]];
45
+ }
46
+ if (!options.copyAsMarkdownHidden) {
47
+ [children addObject:[UIAction actionWithTitle:copyAsMarkdownLabel ?: @""
48
+ image:[RCTUIImage systemImageNamed:@"doc.text"]
49
+ identifier:nil
50
+ handler:^(__kindof UIAction *action) { copyMarkdown(); }]];
51
+ }
52
+ return [UIMenu menuWithTitle:@"" children:children];
53
+ }];
54
+ }
55
+ #endif
56
+
57
+ NS_ASSUME_NONNULL_END
@@ -9,6 +9,12 @@ NS_ASSUME_NONNULL_BEGIN
9
9
  typedef struct {
10
10
  BOOL copyAsMarkdown;
11
11
  BOOL copyImageURL;
12
+ BOOL copyEnabled;
13
+ // Copy writes Markdown as plain text instead of rich text.
14
+ BOOL copyFormatMarkdown;
15
+ // Drop every system-provided item from the text selection menu.
16
+ BOOL systemItemsNone;
17
+ BOOL codeBlockCopyButton;
12
18
  // The owner must keep these strings alive for the duration of the call (the
13
19
  // view holds them in strong ivars).
14
20
  __unsafe_unretained NSString *_Nullable copyLabel;
@@ -36,6 +42,13 @@ static inline NSString *ENRMResolveImageURLsTitle(ENRMSelectionMenuConfig config
36
42
  return [titleTemplate stringByReplacingOccurrencesOfString:@"{count}" withString:[@(count) stringValue]];
37
43
  }
38
44
 
45
+ /// Defaults matching the JS-side defaults, used until the first props update.
46
+ static inline ENRMSelectionMenuConfig ENRMDefaultSelectionMenuConfig(void)
47
+ {
48
+ return (ENRMSelectionMenuConfig){
49
+ .copyAsMarkdown = YES, .copyImageURL = YES, .copyEnabled = YES, .codeBlockCopyButton = YES};
50
+ }
51
+
39
52
  #ifdef __cplusplus
40
53
 
41
54
  /// Strong owners for the label strings in ENRMSelectionMenuConfig.
@@ -63,13 +76,17 @@ template <typename T> static inline ENRMSelectionMenuLabels ENRMParseSelectionMe
63
76
  };
64
77
  }
65
78
 
66
- /// Builds an ENRMSelectionMenuConfig from pre-parsed labels and boolean flags.
67
- static inline ENRMSelectionMenuConfig ENRMBuildSelectionMenuConfig(const ENRMSelectionMenuLabels &labels,
68
- bool copyAsMarkdown, bool copyImageUrl)
79
+ /// Builds an ENRMSelectionMenuConfig from pre-parsed labels and the codegen struct's flags.
80
+ template <typename T>
81
+ static inline ENRMSelectionMenuConfig ENRMBuildSelectionMenuConfig(const ENRMSelectionMenuLabels &labels, const T &src)
69
82
  {
70
83
  return (ENRMSelectionMenuConfig){
71
- .copyAsMarkdown = copyAsMarkdown,
72
- .copyImageURL = copyImageUrl,
84
+ .copyAsMarkdown = src.copyAsMarkdown,
85
+ .copyImageURL = src.copyImageUrl,
86
+ .copyEnabled = src.copyEnabled,
87
+ .copyFormatMarkdown = src.copyFormatMarkdown,
88
+ .systemItemsNone = src.systemItemsNone,
89
+ .codeBlockCopyButton = src.codeBlockCopyButton,
73
90
  .copyLabel = labels.copyLabel,
74
91
  .copyAsMarkdownLabel = labels.copyAsMarkdownLabel,
75
92
  .copyImageUrlLabel = labels.copyImageUrlLabel,
@@ -10,14 +10,24 @@ static NSString *const kActionIdentifierCopy = @"com.swmansion.enriched.markdown
10
10
  static NSString *const kActionIdentifierCopyMarkdown = @"com.swmansion.enriched.markdown.copyMarkdown";
11
11
  static NSString *const kActionIdentifierCopyImageURL = @"com.swmansion.enriched.markdown.copyImageURL";
12
12
 
13
- static UIAction *createCopyAction(NSAttributedString *selectedText, NSString *markdown, StyleConfig *styleConfig,
14
- NSString *copyLabel)
13
+ static UIAction *_Nullable createCopyAction(NSAttributedString *selectedText, NSString *markdown,
14
+ StyleConfig *styleConfig, ENRMSelectionMenuConfig selectionMenuConfig)
15
15
  {
16
- return [UIAction actionWithTitle:copyLabel
16
+ if (!selectionMenuConfig.copyEnabled)
17
+ return nil;
18
+
19
+ BOOL writesMarkdown = selectionMenuConfig.copyFormatMarkdown;
20
+ return [UIAction actionWithTitle:selectionMenuConfig.copyLabel
17
21
  image:[RCTUIImage systemImageNamed:@"doc.on.doc"]
18
22
  identifier:kActionIdentifierCopy
19
23
  handler:^(__kindof UIAction *action) {
20
- copyAttributedStringToPasteboard(selectedText, markdown, styleConfig);
24
+ if (!writesMarkdown) {
25
+ copyAttributedStringToPasteboard(selectedText, markdown, styleConfig);
26
+ } else {
27
+ // Plain text only: with HTML/RTF alongside, rich-paste targets
28
+ // would take those and drop the Markdown.
29
+ copyStringToPasteboard(markdown.length > 0 ? markdown : selectedText.string);
30
+ }
21
31
  }];
22
32
  }
23
33
 
@@ -48,10 +58,11 @@ static UIAction *_Nullable createCopyImageURLAction(NSArray<NSString *> *imageUR
48
58
  }
49
59
 
50
60
  /// Rebuilds the standard-edit menu with the system Copy swapped for the enhanced
51
- /// copy action. All other system items are kept — dropping them would remove
52
- /// Select All, which on iOS 16+ is the only way to start a selection from the
53
- /// long-press menu of a non-editable text view.
54
- static UIMenu *createEnhancedStandardEditMenu(UIMenu *originalMenu, UIAction *copyAction)
61
+ /// copy action, or dropped when `copyAction` is nil (Copy disabled). All other
62
+ /// system items are kept — dropping them would remove Select All, which on
63
+ /// iOS 16+ is the only way to start a selection from the long-press menu of a
64
+ /// non-editable text view.
65
+ static UIMenu *createEnhancedStandardEditMenu(UIMenu *originalMenu, UIAction *_Nullable copyAction)
55
66
  {
56
67
  NSMutableArray<UIMenuElement *> *children = [NSMutableArray arrayWithCapacity:originalMenu.children.count];
57
68
  BOOL replacedCopy = NO;
@@ -59,14 +70,16 @@ static UIMenu *createEnhancedStandardEditMenu(UIMenu *originalMenu, UIAction *co
59
70
  for (UIMenuElement *element in originalMenu.children) {
60
71
  if (!replacedCopy && [element isKindOfClass:[UICommand class]] &&
61
72
  ((UICommand *)element).action == @selector(copy:)) {
62
- [children addObject:copyAction];
73
+ if (copyAction) {
74
+ [children addObject:copyAction];
75
+ }
63
76
  replacedCopy = YES;
64
77
  continue;
65
78
  }
66
79
  [children addObject:element];
67
80
  }
68
81
 
69
- if (!replacedCopy) {
82
+ if (!replacedCopy && copyAction) {
70
83
  [children insertObject:copyAction atIndex:0];
71
84
  }
72
85
 
@@ -101,7 +114,7 @@ UIMenu *buildEditMenuForSelection(NSAttributedString *attributedText, NSRange ra
101
114
  NSString *markdown = markdownForRange(attributedText, range, cachedMarkdown);
102
115
  NSArray<NSString *> *imageURLs = imageURLsInRange(attributedText, range);
103
116
 
104
- UIAction *copyAction = createCopyAction(selectedText, markdown, styleConfig, selectionMenuConfig.copyLabel);
117
+ UIAction *copyAction = createCopyAction(selectedText, markdown, styleConfig, selectionMenuConfig);
105
118
  UIAction *copyMarkdownAction = selectionMenuConfig.copyAsMarkdown
106
119
  ? createCopyMarkdownAction(markdown, selectionMenuConfig.copyAsMarkdownLabel)
107
120
  : nil;
@@ -109,6 +122,16 @@ UIMenu *buildEditMenuForSelection(NSAttributedString *attributedText, NSRange ra
109
122
  selectionMenuConfig.copyImageURL ? createCopyImageURLAction(imageURLs, selectionMenuConfig) : nil;
110
123
 
111
124
  NSMutableArray<UIMenuElement *> *result = [NSMutableArray array];
125
+
126
+ if (selectionMenuConfig.systemItemsNone) {
127
+ // Skip suggestedActions entirely. An empty result still yields an (empty)
128
+ // menu: returning nil would make UIKit present its default menu.
129
+ addOptionalAction(result, copyAction);
130
+ addOptionalAction(result, copyMarkdownAction);
131
+ addOptionalAction(result, copyImageURLAction);
132
+ return [UIMenu menuWithChildren:[(customActions ?: @[]) arrayByAddingObjectsFromArray:result]];
133
+ }
134
+
112
135
  BOOL foundStandardEditMenu = NO;
113
136
 
114
137
  for (UIMenuElement *element in suggestedActions) {
@@ -128,8 +151,8 @@ UIMenu *buildEditMenuForSelection(NSAttributedString *attributedText, NSRange ra
128
151
  }
129
152
 
130
153
  if (!foundStandardEditMenu) {
131
- [result insertObject:copyAction atIndex:0];
132
- insertOptionalAction(result, copyMarkdownAction, 1);
154
+ insertOptionalAction(result, copyMarkdownAction, 0);
155
+ insertOptionalAction(result, copyAction, 0);
133
156
  addOptionalAction(result, copyImageURLAction);
134
157
  }
135
158
 
@@ -1,4 +1,5 @@
1
1
  #pragma once
2
+ #import "ENRMBlockMenu.h"
2
3
  #import "ENRMUIKit.h"
3
4
  #import "StyleConfig.h"
4
5
 
@@ -33,12 +34,18 @@ typedef void (^ENRMCodeBlockCopyBlock)(NSString *code, NSString *language);
33
34
 
34
35
  /// Suppresses the long-press copy menu on this block. Mirrors the
35
36
  /// `contextMenuHidden` prop; the header copy button is a visible control, not a
36
- /// context menu, and stays.
37
+ /// context menu, and stays (hide it with `menuOptions.copyButtonHidden`).
37
38
  @property (nonatomic, assign) BOOL contextMenuHidden;
38
39
 
40
+ /// Copy / Copy as Markdown visibility, Copy format and the header copy button
41
+ /// from `selectionMenuConfig`. `copyHidden` also drops the VoiceOver copy action;
42
+ /// the header button and VoiceOver action always copy the raw code.
43
+ @property (nonatomic, assign) ENRMBlockMenuOptions menuOptions;
44
+
39
45
  // Fired when the code is copied (header button, context-menu Copy, or the
40
46
  // VoiceOver copy action); set by the host to bridge up to the JS onCopyPress
41
- // event. Not fired for "Copy as Markdown".
47
+ // event. Not fired for "Copy as Markdown", nor for the context-menu Copy when
48
+ // `menuOptions.copyWritesMarkdown` is set.
42
49
  @property (nonatomic, copy, nullable) ENRMCodeBlockCopyBlock onCopyPress;
43
50
 
44
51
  @end
@@ -175,6 +175,13 @@ static BOOL ENRMColorIsDark(RCTUIColor *color)
175
175
  _copyButton.accessibilityLabel = _copyLabel;
176
176
  }
177
177
 
178
+ - (void)setMenuOptions:(ENRMBlockMenuOptions)menuOptions
179
+ {
180
+ _menuOptions = menuOptions;
181
+ // Hiding the button leaves the header (and its height) untouched.
182
+ _copyButton.hidden = menuOptions.copyButtonHidden;
183
+ }
184
+
178
185
  - (void)setPending:(BOOL)pending
179
186
  {
180
187
  if (_pending == pending) {
@@ -490,24 +497,10 @@ static BOOL ENRMColorIsDark(RCTUIColor *color)
490
497
  if (_pending || self.contextMenuHidden) {
491
498
  return nil;
492
499
  }
493
- return [UIContextMenuConfiguration
494
- configurationWithIdentifier:nil
495
- previewProvider:nil
496
- actionProvider:^UIMenu *(NSArray<UIMenuElement *> *suggestedActions) {
497
- UIAction *copyCode =
498
- [UIAction actionWithTitle:self.copyLabel
499
- image:[RCTUIImage systemImageNamed:@"doc.on.doc"]
500
- identifier:nil
501
- handler:^(__kindof UIAction *action) { [self copyCodeToPasteboard]; }];
502
-
503
- UIAction *copyMarkdown =
504
- [UIAction actionWithTitle:self.copyAsMarkdownLabel
505
- image:[RCTUIImage systemImageNamed:@"doc.text"]
506
- identifier:nil
507
- handler:^(__kindof UIAction *action) { [self copyMarkdownToPasteboard]; }];
508
-
509
- return [UIMenu menuWithTitle:@"" children:@[ copyCode, copyMarkdown ]];
510
- }];
500
+ __weak __typeof(self) weakSelf = self;
501
+ return ENRMBlockContextMenuConfiguration(
502
+ self.menuOptions, self.copyLabel, self.copyAsMarkdownLabel, ^{ [weakSelf copyCodeToPasteboard]; },
503
+ ^{ [weakSelf copyMarkdownToPasteboard]; });
511
504
  }
512
505
  #endif
513
506
 
@@ -546,7 +539,7 @@ static BOOL ENRMColorIsDark(RCTUIColor *color)
546
539
  // button subview from VoiceOver; expose the copy action explicitly instead.
547
540
  - (NSArray<UIAccessibilityCustomAction *> *)accessibilityCustomActions
548
541
  {
549
- if (_pending || self.copyLabel.length == 0) {
542
+ if (_pending || self.menuOptions.copyHidden || self.copyLabel.length == 0) {
550
543
  return @[];
551
544
  }
552
545
  UIAccessibilityCustomAction *copyAction =
@@ -1,4 +1,5 @@
1
1
  #pragma once
2
+ #import "ENRMBlockMenu.h"
2
3
  #import "ENRMUIKit.h"
3
4
  #import "StyleConfig.h"
4
5
 
@@ -35,6 +36,9 @@ NS_ASSUME_NONNULL_BEGIN
35
36
  /// `contextMenuHidden` prop; selection and link handling are unaffected.
36
37
  @property (nonatomic, assign) BOOL contextMenuHidden;
37
38
 
39
+ /// Copy / Copy as Markdown visibility and Copy format from `selectionMenuConfig`.
40
+ @property (nonatomic, assign) ENRMBlockMenuOptions menuOptions;
41
+
38
42
  @end
39
43
 
40
44
  NS_ASSUME_NONNULL_END
@@ -130,25 +130,10 @@
130
130
  if (self.contextMenuHidden) {
131
131
  return nil;
132
132
  }
133
-
134
- return [UIContextMenuConfiguration
135
- configurationWithIdentifier:nil
136
- previewProvider:nil
137
- actionProvider:^UIMenu *(NSArray<UIMenuElement *> *suggestedActions) {
138
- UIAction *copyPlainText =
139
- [UIAction actionWithTitle:self.copyLabel
140
- image:[RCTUIImage systemImageNamed:@"doc.on.doc"]
141
- identifier:nil
142
- handler:^(__kindof UIAction *action) { [self copyLatexToPasteboard]; }];
143
-
144
- UIAction *copyMarkdown =
145
- [UIAction actionWithTitle:self.copyAsMarkdownLabel
146
- image:[RCTUIImage systemImageNamed:@"doc.text"]
147
- identifier:nil
148
- handler:^(__kindof UIAction *action) { [self copyMarkdownToPasteboard]; }];
149
-
150
- return [UIMenu menuWithTitle:@"" children:@[ copyPlainText, copyMarkdown ]];
151
- }];
133
+ __weak __typeof(self) weakSelf = self;
134
+ return ENRMBlockContextMenuConfiguration(
135
+ self.menuOptions, self.copyLabel, self.copyAsMarkdownLabel, ^{ [weakSelf copyLatexToPasteboard]; },
136
+ ^{ [weakSelf copyMarkdownToPasteboard]; });
152
137
  }
153
138
  #endif
154
139
 
@@ -1,4 +1,5 @@
1
1
  #pragma once
2
+ #import "ENRMBlockMenu.h"
2
3
  #import "ENRMUIKit.h"
3
4
  #import "ParagraphStyleUtils.h"
4
5
  #import "StyleConfig.h"
@@ -56,6 +57,9 @@ typedef void (^TableLinkPressBlock)(NSString *url);
56
57
  /// `contextMenuHidden` prop; selection and link handling are unaffected.
57
58
  @property (nonatomic, assign) BOOL contextMenuHidden;
58
59
 
60
+ /// Copy / Copy as Markdown visibility and Copy format from `selectionMenuConfig`.
61
+ @property (nonatomic, assign) ENRMBlockMenuOptions menuOptions;
62
+
59
63
  @property (nonatomic, readonly) NSUInteger rowCount;
60
64
 
61
65
  - (void)animateNewRowsFromPreviousCount:(NSUInteger)previousRowCount duration:(NSTimeInterval)duration;
@@ -264,7 +264,8 @@ static void ENRMTableComputeLayout(NSArray<NSArray<TableCellData *> *> *rows, NS
264
264
  // a single drawRect: pass (no subview / layer compositing issues).
265
265
  ENRMTableGridView *gridView = [[ENRMTableGridView alloc] initWithFrame:CGRectZero];
266
266
  __weak TableContainerView *weakSelf = self;
267
- gridView.menuProvider = ^NSMenu * {
267
+ gridView.menuProvider = ^NSMenu *
268
+ {
268
269
  TableContainerView *strongSelf = weakSelf;
269
270
  if (!strongSelf)
270
271
  return nil;
@@ -467,25 +468,10 @@ static void ENRMTableComputeLayout(NSArray<NSArray<TableCellData *> *> *rows, NS
467
468
  if (self.contextMenuHidden) {
468
469
  return nil;
469
470
  }
470
-
471
- return [UIContextMenuConfiguration
472
- configurationWithIdentifier:nil
473
- previewProvider:nil
474
- actionProvider:^UIMenu *(NSArray<UIMenuElement *> *suggestedActions) {
475
- UIAction *copyMarkdown =
476
- [UIAction actionWithTitle:self.copyAsMarkdownLabel
477
- image:[RCTUIImage systemImageNamed:@"doc.text"]
478
- identifier:nil
479
- handler:^(__kindof UIAction *action) { [self copyMarkdownToPasteboard]; }];
480
-
481
- UIAction *copyPlainText =
482
- [UIAction actionWithTitle:self.copyLabel
483
- image:[RCTUIImage systemImageNamed:@"doc.on.doc"]
484
- identifier:nil
485
- handler:^(__kindof UIAction *action) { [self copyTableToPasteboard]; }];
486
-
487
- return [UIMenu menuWithTitle:@"" children:@[ copyPlainText, copyMarkdown ]];
488
- }];
471
+ __weak __typeof(self) weakSelf = self;
472
+ return ENRMBlockContextMenuConfiguration(
473
+ self.menuOptions, self.copyLabel, self.copyAsMarkdownLabel, ^{ [weakSelf copyTableToPasteboard]; },
474
+ ^{ [weakSelf copyMarkdownToPasteboard]; });
489
475
  }
490
476
  #endif // !TARGET_OS_OSX
491
477
 
@@ -276,6 +276,14 @@ export interface SelectionMenuConfig {
276
276
  // Precomputed plural templates indexed by image count (0..100). Empty when no
277
277
  // pluralLabels are set; native then uses copyImageUrlLabel/copyImageUrlsLabel.
278
278
  copyImageUrlPluralTemplates: ReadonlyArray<string>;
279
+ // false removes the Copy item from the text and block menus.
280
+ copyEnabled: boolean;
281
+ // true: Copy writes Markdown (plain text) instead of rich text / raw block content.
282
+ copyFormatMarkdown: boolean;
283
+ // true: the text selection menu drops every system-provided item.
284
+ systemItemsNone: boolean;
285
+ // false hides the copy button in the code block header.
286
+ codeBlockCopyButton: boolean;
279
287
  }
280
288
 
281
289
  export interface OnContextMenuItemPressEvent {
@@ -277,6 +277,14 @@ export interface SelectionMenuConfig {
277
277
  // Precomputed plural templates indexed by image count (0..100). Empty when no
278
278
  // pluralLabels are set; native then uses copyImageUrlLabel/copyImageUrlsLabel.
279
279
  copyImageUrlPluralTemplates: ReadonlyArray<string>;
280
+ // false removes the Copy item from the text and block menus.
281
+ copyEnabled: boolean;
282
+ // true: Copy writes Markdown (plain text) instead of rich text / raw block content.
283
+ copyFormatMarkdown: boolean;
284
+ // true: the text selection menu drops every system-provided item.
285
+ systemItemsNone: boolean;
286
+ // false hides the copy button in the code block header.
287
+ codeBlockCopyButton: boolean;
280
288
  }
281
289
 
282
290
  export interface OnContextMenuItemPressEvent {
@@ -194,6 +194,8 @@ export const EnrichedMarkdownText = ({
194
194
  // `as unknown` cast; the public type only exposes the object shape.
195
195
  const config = selectionMenuConfig;
196
196
  const copy = normalizeMenuItem(config?.copy, true, DEFAULT_COPY_LABEL);
197
+ const copyFormat = config?.copy?.format;
198
+ const codeBlockCopyButton = normalizeMenuItem(config?.codeBlockCopyButton, true, '');
197
199
  const copyAsMarkdown = normalizeLegacyBooleanMenuItem(config?.copyAsMarkdown, 'selectionMenuConfig', 'copyAsMarkdown', true, DEFAULT_COPY_AS_MARKDOWN_LABEL);
198
200
  const copyImageUrl = normalizeLegacyBooleanMenuItem(config?.copyImageUrl, 'selectionMenuConfig', 'copyImageUrl', true, DEFAULT_COPY_IMAGE_URL_LABEL);
199
201
  const pluralLabels = config?.copyImageUrl?.pluralLabels;
@@ -204,7 +206,11 @@ export const EnrichedMarkdownText = ({
204
206
  copyAsMarkdownLabel: copyAsMarkdown.label,
205
207
  copyImageUrlLabel: copyImageUrl.label,
206
208
  copyImageUrlsLabel: pluralLabels?.other ?? DEFAULT_COPY_IMAGE_URLS_LABEL,
207
- copyImageUrlPluralTemplates: buildPluralTemplates(pluralLabels, copyImageUrl.label)
209
+ copyImageUrlPluralTemplates: buildPluralTemplates(pluralLabels, copyImageUrl.label),
210
+ copyEnabled: copy.enabled,
211
+ copyFormatMarkdown: copyFormat === 'markdown',
212
+ systemItemsNone: config?.systemItems === 'none',
213
+ codeBlockCopyButton: codeBlockCopyButton.enabled
208
214
  };
209
215
  }, [selectionMenuConfig]);
210
216
  const resolvedAccessibilityLabels = useMemo(() => resolveAccessibilityLabels(accessibilityLabels), [accessibilityLabels]);
@@ -1 +1 @@
1
- {"version":3,"names":["useMemo","useCallback","useRef","useEffect","EnrichedMarkdownTextNativeComponent","EnrichedMarkdownNativeComponent","normalizeMarkdownStyle","resolveAccessibilityLabels","normalizeMenuItem","normalizeLegacyBooleanMenuItem","jsx","_jsx","DEFAULT_COPY_LABEL","DEFAULT_COPY_AS_MARKDOWN_LABEL","DEFAULT_COPY_IMAGE_URL_LABEL","DEFAULT_COPY_IMAGE_URLS_LABEL","buildPluralTemplates","pluralLabels","singularLabel","IntlRef","Intl","PluralRules","pluralRules","other","byCategory","zero","one","two","few","many","templates","n","push","select","defaultMd4cFlags","underline","superscript","subscript","latexMath","highlight","hardSoftBreaks","EnrichedMarkdownText","markdown","markdownStyle","containerStyle","onLinkPress","onLinkLongPress","onTaskListItemPress","enableTaskListItemToggle","onCopyPress","enableLinkPreview","selectable","md4cFlags","allowFontScaling","maxFontSizeMultiplier","allowTrailingMargin","flavor","streamingAnimation","streamingConfig","spoilerOverlay","contextMenuItems","imageRequestHeaders","contextMenuHidden","selectionMenuConfig","accessibilityLabels","selectionColor","selectionHandleColor","textBreakStrategy","lineBreakStrategyIOS","writingDirection","rest","normalizedStyleRef","normalized","current","normalizedStyle","normalizedMd4cFlags","contextMenuCallbacksRef","Map","callbacksMap","item","set","text","onPress","nativeContextMenuItems","filter","visible","map","icon","nativeImageRequestHeaders","Object","entries","name","value","sort","a","b","undefined","handleContextMenuItemPress","e","itemText","selectedText","selectionStart","selectionEnd","nativeEvent","callback","get","selection","start","end","handleLinkPress","url","handleLinkLongPress","handleTaskListItemPress","index","checked","handleCopyPress","code","language","tableMode","codeBlockMode","normalizedStreamingConfig","normalizedSelectionMenuConfig","config","copy","copyAsMarkdown","copyImageUrl","enabled","copyLabel","label","copyAsMarkdownLabel","copyImageUrlLabel","copyImageUrlsLabel","copyImageUrlPluralTemplates","resolvedAccessibilityLabels","sharedProps","style","onContextMenuItemPress"],"sourceRoot":"../../../src","sources":["native/EnrichedMarkdownText.tsx"],"mappings":"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","ignoreList":[]}
1
+ {"version":3,"names":["useMemo","useCallback","useRef","useEffect","EnrichedMarkdownTextNativeComponent","EnrichedMarkdownNativeComponent","normalizeMarkdownStyle","resolveAccessibilityLabels","normalizeMenuItem","normalizeLegacyBooleanMenuItem","jsx","_jsx","DEFAULT_COPY_LABEL","DEFAULT_COPY_AS_MARKDOWN_LABEL","DEFAULT_COPY_IMAGE_URL_LABEL","DEFAULT_COPY_IMAGE_URLS_LABEL","buildPluralTemplates","pluralLabels","singularLabel","IntlRef","Intl","PluralRules","pluralRules","other","byCategory","zero","one","two","few","many","templates","n","push","select","defaultMd4cFlags","underline","superscript","subscript","latexMath","highlight","hardSoftBreaks","EnrichedMarkdownText","markdown","markdownStyle","containerStyle","onLinkPress","onLinkLongPress","onTaskListItemPress","enableTaskListItemToggle","onCopyPress","enableLinkPreview","selectable","md4cFlags","allowFontScaling","maxFontSizeMultiplier","allowTrailingMargin","flavor","streamingAnimation","streamingConfig","spoilerOverlay","contextMenuItems","imageRequestHeaders","contextMenuHidden","selectionMenuConfig","accessibilityLabels","selectionColor","selectionHandleColor","textBreakStrategy","lineBreakStrategyIOS","writingDirection","rest","normalizedStyleRef","normalized","current","normalizedStyle","normalizedMd4cFlags","contextMenuCallbacksRef","Map","callbacksMap","item","set","text","onPress","nativeContextMenuItems","filter","visible","map","icon","nativeImageRequestHeaders","Object","entries","name","value","sort","a","b","undefined","handleContextMenuItemPress","e","itemText","selectedText","selectionStart","selectionEnd","nativeEvent","callback","get","selection","start","end","handleLinkPress","url","handleLinkLongPress","handleTaskListItemPress","index","checked","handleCopyPress","code","language","tableMode","codeBlockMode","normalizedStreamingConfig","normalizedSelectionMenuConfig","config","copy","copyFormat","format","codeBlockCopyButton","copyAsMarkdown","copyImageUrl","enabled","copyLabel","label","copyAsMarkdownLabel","copyImageUrlLabel","copyImageUrlsLabel","copyImageUrlPluralTemplates","copyEnabled","copyFormatMarkdown","systemItemsNone","systemItems","resolvedAccessibilityLabels","sharedProps","style","onContextMenuItemPress"],"sourceRoot":"../../../src","sources":["native/EnrichedMarkdownText.tsx"],"mappings":"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","ignoreList":[]}
@@ -232,6 +232,10 @@ export interface SelectionMenuConfig {
232
232
  copyImageUrlLabel: string;
233
233
  copyImageUrlsLabel: string;
234
234
  copyImageUrlPluralTemplates: ReadonlyArray<string>;
235
+ copyEnabled: boolean;
236
+ copyFormatMarkdown: boolean;
237
+ systemItemsNone: boolean;
238
+ codeBlockCopyButton: boolean;
235
239
  }
236
240
  export interface OnContextMenuItemPressEvent {
237
241
  itemText: string;