react-native-enriched-markdown-scaffold 0.6.0-scaffold.8 → 0.7.4-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 (150) hide show
  1. package/ReactNativeEnrichedMarkdown.podspec +62 -11
  2. package/android/generated/java/com/facebook/react/viewmanagers/EnrichedMarkdownManagerDelegate.java +3 -0
  3. package/android/generated/java/com/facebook/react/viewmanagers/EnrichedMarkdownManagerInterface.java +1 -0
  4. package/android/generated/java/com/facebook/react/viewmanagers/EnrichedMarkdownTextInputManagerDelegate.java +9 -0
  5. package/android/generated/java/com/facebook/react/viewmanagers/EnrichedMarkdownTextInputManagerInterface.java +3 -0
  6. package/android/generated/java/com/facebook/react/viewmanagers/EnrichedMarkdownTextManagerDelegate.java +3 -0
  7. package/android/generated/java/com/facebook/react/viewmanagers/EnrichedMarkdownTextManagerInterface.java +1 -0
  8. package/android/generated/jni/react/renderer/components/EnrichedMarkdownTextSpec/Props.cpp +20 -0
  9. package/android/generated/jni/react/renderer/components/EnrichedMarkdownTextSpec/Props.h +744 -0
  10. package/android/src/main/baseline-prof.txt +75 -2
  11. package/android/src/main/java/com/swmansion/enriched/markdown/EnrichedMarkdown.kt +62 -0
  12. package/android/src/main/java/com/swmansion/enriched/markdown/EnrichedMarkdownInternalText.kt +10 -2
  13. package/android/src/main/java/com/swmansion/enriched/markdown/EnrichedMarkdownManager.kt +10 -0
  14. package/android/src/main/java/com/swmansion/enriched/markdown/EnrichedMarkdownText.kt +9 -2
  15. package/android/src/main/java/com/swmansion/enriched/markdown/EnrichedMarkdownTextManager.kt +10 -0
  16. package/android/src/main/java/com/swmansion/enriched/markdown/accessibility/AccessibilityLabels.kt +15 -0
  17. package/android/src/main/java/com/swmansion/enriched/markdown/accessibility/MarkdownAccessibilityHelper.kt +44 -7
  18. package/android/src/main/java/com/swmansion/enriched/markdown/input/EnrichedMarkdownTextInputManager.kt +52 -0
  19. package/android/src/main/java/com/swmansion/enriched/markdown/input/EnrichedMarkdownTextInputView.kt +89 -11
  20. package/android/src/main/java/com/swmansion/enriched/markdown/input/formatting/FormattingStore.kt +19 -0
  21. package/android/src/main/java/com/swmansion/enriched/markdown/input/formatting/InputParser.kt +22 -3
  22. package/android/src/main/java/com/swmansion/enriched/markdown/input/formatting/InputRemend.kt +1 -0
  23. package/android/src/main/java/com/swmansion/enriched/markdown/input/layout/InputMeasurementStore.kt +7 -1
  24. package/android/src/main/java/com/swmansion/enriched/markdown/input/toolbar/InputContextMenu.kt +54 -13
  25. package/android/src/main/java/com/swmansion/enriched/markdown/parser/MarkdownASTNode.kt +17 -0
  26. package/android/src/main/java/com/swmansion/enriched/markdown/renderer/SpanStyleCache.kt +4 -4
  27. package/android/src/main/java/com/swmansion/enriched/markdown/utils/common/MarkdownViewManagerUtils.kt +30 -0
  28. package/android/src/main/java/com/swmansion/enriched/markdown/utils/text/view/LinkEvents.kt +22 -0
  29. package/android/src/main/java/com/swmansion/enriched/markdown/utils/text/view/SelectionActionMode.kt +36 -7
  30. package/android/src/main/java/com/swmansion/enriched/markdown/views/TableContainerView.kt +73 -3
  31. package/android/src/main/jni/CMakeLists.txt +15 -1
  32. package/android/src/math/java/com/swmansion/enriched/markdown/views/MathContainerView.kt +24 -2
  33. package/app.plugin.js +2 -1
  34. package/cpp/parser/MD4CParser.cpp +1 -1
  35. package/cpp/wasm/build.sh +9 -9
  36. package/docs/ACCESSIBILITY.md +172 -0
  37. package/docs/API_REFERENCE.md +948 -0
  38. package/docs/COPY_OPTIONS.md +127 -0
  39. package/docs/ELEMENTS_STRUCTURE.md +112 -0
  40. package/docs/IMAGE_CACHING.md +25 -0
  41. package/docs/INPUT.md +233 -0
  42. package/docs/LATEX_MATH.md +136 -0
  43. package/docs/MACOS.md +19 -0
  44. package/docs/MARKDOWN_STREAMING.md +36 -0
  45. package/docs/MENTIONS.md +97 -0
  46. package/docs/RTL.md +82 -0
  47. package/docs/STYLES.md +519 -0
  48. package/docs/TEXT.md +110 -0
  49. package/docs/WEB.md +49 -0
  50. package/ios/EnrichedMarkdown.mm +82 -25
  51. package/ios/EnrichedMarkdownText.mm +37 -5
  52. package/ios/generated/ReactCodegen/EnrichedMarkdownTextSpec/Props.cpp +20 -0
  53. package/ios/generated/ReactCodegen/EnrichedMarkdownTextSpec/Props.h +744 -0
  54. package/ios/generated/ReactCodegen/EnrichedMarkdownTextSpec/RCTComponentViewHelpers.h +15 -0
  55. package/ios/input/ENRMFormattingStore.h +5 -0
  56. package/ios/input/ENRMFormattingStore.mm +34 -0
  57. package/ios/input/ENRMInputTextView.h +2 -0
  58. package/ios/input/ENRMInputTextView.mm +8 -17
  59. package/ios/input/ENRMMarkdownSerializer.mm +1 -1
  60. package/ios/input/EnrichedMarkdownTextInput+ContextMenu.mm +71 -53
  61. package/ios/input/EnrichedMarkdownTextInput+Internal.h +26 -0
  62. package/ios/input/EnrichedMarkdownTextInput.h +1 -0
  63. package/ios/input/EnrichedMarkdownTextInput.mm +230 -29
  64. package/ios/input/styles/ENRMBoldStyleHandler.mm +3 -2
  65. package/ios/input/styles/ENRMItalicStyleHandler.mm +3 -2
  66. package/ios/renderer/AttributedRenderer.m +51 -6
  67. package/ios/renderer/ENRMMathInlineRenderer.m +5 -1
  68. package/ios/styles/ENRMFontSlot.h +1 -1
  69. package/ios/utils/ENRMAccessibilityLabels.h +36 -0
  70. package/ios/utils/ENRMAccessibilityLabels.m +5 -0
  71. package/ios/utils/EditMenuUtils+macOS.m +4 -5
  72. package/ios/utils/EditMenuUtils.h +70 -0
  73. package/ios/utils/EditMenuUtils.m +14 -11
  74. package/ios/utils/LastElementUtils.h +39 -2
  75. package/ios/utils/MarkdownAccessibilityElementBuilder.h +18 -16
  76. package/ios/utils/MarkdownAccessibilityElementBuilder.m +64 -32
  77. package/ios/utils/ParagraphStyleUtils.m +21 -2
  78. package/ios/views/ENRMMathContainerView.h +8 -0
  79. package/ios/views/ENRMMathContainerView.m +7 -5
  80. package/ios/views/ENRMTableIOSGridView.h +40 -0
  81. package/ios/views/ENRMTableIOSGridView.m +216 -0
  82. package/ios/views/EnrichedMarkdownInternalText.h +2 -0
  83. package/ios/views/EnrichedMarkdownInternalText.m +2 -0
  84. package/ios/views/TableContainerView.h +8 -0
  85. package/ios/views/TableContainerView.m +72 -128
  86. package/lib/module/EnrichedMarkdownNativeComponent.ts +37 -0
  87. package/lib/module/EnrichedMarkdownTextInput.js +48 -1
  88. package/lib/module/EnrichedMarkdownTextInput.js.map +1 -1
  89. package/lib/module/EnrichedMarkdownTextInputNativeComponent.ts +35 -0
  90. package/lib/module/EnrichedMarkdownTextNativeComponent.ts +37 -0
  91. package/lib/module/accessibilityLabelDefaults.js +64 -0
  92. package/lib/module/accessibilityLabelDefaults.js.map +1 -0
  93. package/lib/module/index.js +1 -0
  94. package/lib/module/index.js.map +1 -1
  95. package/lib/module/native/EnrichedMarkdownText.js +72 -4
  96. package/lib/module/native/EnrichedMarkdownText.js.map +1 -1
  97. package/lib/module/normalizeMenuItem.js +38 -0
  98. package/lib/module/normalizeMenuItem.js.map +1 -0
  99. package/lib/module/types/AccessibilityLabels.js +2 -0
  100. package/lib/module/types/AccessibilityLabels.js.map +1 -0
  101. package/lib/typescript/src/EnrichedMarkdownNativeComponent.d.ts +34 -0
  102. package/lib/typescript/src/EnrichedMarkdownNativeComponent.d.ts.map +1 -1
  103. package/lib/typescript/src/EnrichedMarkdownTextInput.d.ts +55 -1
  104. package/lib/typescript/src/EnrichedMarkdownTextInput.d.ts.map +1 -1
  105. package/lib/typescript/src/EnrichedMarkdownTextInputNativeComponent.d.ts +30 -0
  106. package/lib/typescript/src/EnrichedMarkdownTextInputNativeComponent.d.ts.map +1 -1
  107. package/lib/typescript/src/EnrichedMarkdownTextNativeComponent.d.ts +34 -0
  108. package/lib/typescript/src/EnrichedMarkdownTextNativeComponent.d.ts.map +1 -1
  109. package/lib/typescript/src/accessibilityLabelDefaults.d.ts +16 -0
  110. package/lib/typescript/src/accessibilityLabelDefaults.d.ts.map +1 -0
  111. package/lib/typescript/src/index.d.ts +4 -2
  112. package/lib/typescript/src/index.d.ts.map +1 -1
  113. package/lib/typescript/src/native/EnrichedMarkdownText.d.ts +3 -3
  114. package/lib/typescript/src/native/EnrichedMarkdownText.d.ts.map +1 -1
  115. package/lib/typescript/src/normalizeMenuItem.d.ts +7 -0
  116. package/lib/typescript/src/normalizeMenuItem.d.ts.map +1 -0
  117. package/lib/typescript/src/types/AccessibilityLabels.d.ts +114 -0
  118. package/lib/typescript/src/types/AccessibilityLabels.d.ts.map +1 -0
  119. package/lib/typescript/src/types/MarkdownTextProps.d.ts +78 -9
  120. package/lib/typescript/src/types/MarkdownTextProps.d.ts.map +1 -1
  121. package/package.json +4 -2
  122. package/plugin/build/withAndroidMath.js +19 -0
  123. package/plugin/build/withIosMath.js +28 -0
  124. package/plugin/build/withReactNativeEnrichedMarkdown.js +11 -0
  125. package/plugin/tsconfig.build.json +16 -0
  126. package/src/EnrichedMarkdownNativeComponent.ts +37 -0
  127. package/src/EnrichedMarkdownTextInput.tsx +117 -1
  128. package/src/EnrichedMarkdownTextInputNativeComponent.ts +35 -0
  129. package/src/EnrichedMarkdownTextNativeComponent.ts +37 -0
  130. package/src/accessibilityLabelDefaults.ts +83 -0
  131. package/src/index.tsx +11 -0
  132. package/src/native/EnrichedMarkdownText.tsx +120 -6
  133. package/src/normalizeMenuItem.ts +52 -0
  134. package/src/types/AccessibilityLabels.ts +118 -0
  135. package/src/types/MarkdownTextProps.ts +74 -9
  136. package/lib/module/plugin/withAndroidMath.js +0 -20
  137. package/lib/module/plugin/withAndroidMath.js.map +0 -1
  138. package/lib/module/plugin/withIosMath.js +0 -23
  139. package/lib/module/plugin/withIosMath.js.map +0 -1
  140. package/lib/module/plugin/withReactNativeEnrichedMarkdown.js +0 -16
  141. package/lib/module/plugin/withReactNativeEnrichedMarkdown.js.map +0 -1
  142. package/lib/typescript/src/plugin/withAndroidMath.d.ts +0 -5
  143. package/lib/typescript/src/plugin/withAndroidMath.d.ts.map +0 -1
  144. package/lib/typescript/src/plugin/withIosMath.d.ts +0 -5
  145. package/lib/typescript/src/plugin/withIosMath.d.ts.map +0 -1
  146. package/lib/typescript/src/plugin/withReactNativeEnrichedMarkdown.d.ts +0 -6
  147. package/lib/typescript/src/plugin/withReactNativeEnrichedMarkdown.d.ts.map +0 -1
  148. /package/{src/plugin → plugin/src}/withAndroidMath.ts +0 -0
  149. /package/{src/plugin → plugin/src}/withIosMath.ts +0 -0
  150. /package/{src/plugin → plugin/src}/withReactNativeEnrichedMarkdown.ts +0 -0
@@ -4,6 +4,7 @@
4
4
 
5
5
  # Core View and Rendering
6
6
  Lcom/swmansion/enriched/markdown/EnrichedMarkdown;
7
+ Lcom/swmansion/enriched/markdown/EnrichedMarkdown$DirtyFlag;
7
8
  Lcom/swmansion/enriched/markdown/EnrichedMarkdownInternalText;
8
9
  Lcom/swmansion/enriched/markdown/EnrichedMarkdownManager;
9
10
  Lcom/swmansion/enriched/markdown/EnrichedMarkdownText;
@@ -11,10 +12,18 @@ Lcom/swmansion/enriched/markdown/EnrichedMarkdownTextLayoutManager;
11
12
  Lcom/swmansion/enriched/markdown/EnrichedMarkdownTextManager;
12
13
  Lcom/swmansion/enriched/markdown/EnrichedMarkdownTextPackage;
13
14
  Lcom/swmansion/enriched/markdown/MeasurementStore;
15
+ Lcom/swmansion/enriched/markdown/MeasurementStore$FontScalingSettings;
16
+ Lcom/swmansion/enriched/markdown/MeasurementStore$MeasurementParams;
17
+ Lcom/swmansion/enriched/markdown/MeasurementStore$PaintParams;
14
18
 
15
19
  # Accessibility
20
+ Lcom/swmansion/enriched/markdown/accessibility/AccessibilityLabels;
16
21
  Lcom/swmansion/enriched/markdown/accessibility/AccessibleMarkdownTextView;
17
22
  Lcom/swmansion/enriched/markdown/accessibility/MarkdownAccessibilityHelper;
23
+ Lcom/swmansion/enriched/markdown/accessibility/MarkdownAccessibilityHelper$AccessibilityItem;
24
+ Lcom/swmansion/enriched/markdown/accessibility/MarkdownAccessibilityHelper$ListItemInfo;
25
+ Lcom/swmansion/enriched/markdown/accessibility/MarkdownAccessibilityHelper$SpanRange;
26
+ Lcom/swmansion/enriched/markdown/accessibility/MarkdownAccessibilityHelperKt;
18
27
 
19
28
  # Events
20
29
  Lcom/swmansion/enriched/markdown/events/ContextMenuItemPressEvent;
@@ -25,12 +34,15 @@ Lcom/swmansion/enriched/markdown/events/TaskListItemPressEvent;
25
34
  # Input - Core
26
35
  Lcom/swmansion/enriched/markdown/input/EnrichedMarkdownTextInputManager;
27
36
  Lcom/swmansion/enriched/markdown/input/EnrichedMarkdownTextInputView;
37
+ Lcom/swmansion/enriched/markdown/input/EnrichedMarkdownTextInputView$MentionCandidate;
38
+ Lcom/swmansion/enriched/markdown/input/EnrichedMarkdownTextInputViewKt;
28
39
 
29
40
  # Input - Autolink
30
41
  Lcom/swmansion/enriched/markdown/input/autolink/AutoDetectedLinkColorSpan;
31
42
  Lcom/swmansion/enriched/markdown/input/autolink/AutoDetectedLinkMarkerSpan;
32
43
  Lcom/swmansion/enriched/markdown/input/autolink/AutoDetectedLinkUnderlineSpan;
33
44
  Lcom/swmansion/enriched/markdown/input/autolink/AutoLinkDetector;
45
+ Lcom/swmansion/enriched/markdown/input/autolink/AutoLinkDetectorKt;
34
46
  Lcom/swmansion/enriched/markdown/input/autolink/LinkRegexConfig;
35
47
 
36
48
  # Input - Detection
@@ -62,28 +74,48 @@ Lcom/swmansion/enriched/markdown/input/events/OnStartMentionEvent;
62
74
 
63
75
  # Input - Formatting
64
76
  Lcom/swmansion/enriched/markdown/input/formatting/FormattingStore;
77
+ Lcom/swmansion/enriched/markdown/input/formatting/FormattingStore$EditOverlap;
65
78
  Lcom/swmansion/enriched/markdown/input/formatting/InputFormatter;
66
79
  Lcom/swmansion/enriched/markdown/input/formatting/InputParser;
67
80
  Lcom/swmansion/enriched/markdown/input/formatting/InputRemend;
81
+ Lcom/swmansion/enriched/markdown/input/formatting/InputRemend$DelimiterPair;
68
82
  Lcom/swmansion/enriched/markdown/input/formatting/MarkdownSerializer;
83
+ Lcom/swmansion/enriched/markdown/input/formatting/MarkdownSerializer$BoundaryEvent;
69
84
  Lcom/swmansion/enriched/markdown/input/formatting/MarkdownSpan;
85
+ Lcom/swmansion/enriched/markdown/input/formatting/MarkdownSpan$SpanDescriptor;
70
86
  Lcom/swmansion/enriched/markdown/input/formatting/ParseResult;
87
+ Lcom/swmansion/enriched/markdown/input/formatting/ParseResult$ActiveStyle;
71
88
 
72
89
  # Input - Layout
73
90
  Lcom/swmansion/enriched/markdown/input/layout/InputEventEmitter;
74
91
  Lcom/swmansion/enriched/markdown/input/layout/InputLayoutManager;
75
92
  Lcom/swmansion/enriched/markdown/input/layout/InputMeasurementStore;
93
+ Lcom/swmansion/enriched/markdown/input/layout/InputMeasurementStore$MeasurementParams;
94
+ Lcom/swmansion/enriched/markdown/input/layout/InputMeasurementStore$PaintParams;
76
95
 
77
96
  # Input - Model
78
97
  Lcom/swmansion/enriched/markdown/input/model/CaretRect;
79
98
  Lcom/swmansion/enriched/markdown/input/model/FormattingRange;
80
99
  Lcom/swmansion/enriched/markdown/input/model/InputFormatterStyle;
100
+ Lcom/swmansion/enriched/markdown/input/model/InputLinkVariantStyle;
81
101
  Lcom/swmansion/enriched/markdown/input/model/StyleType;
82
102
 
83
103
  # Input - Styles
84
104
  Lcom/swmansion/enriched/markdown/input/styles/BoldStyleHandler;
85
105
  Lcom/swmansion/enriched/markdown/input/styles/ItalicStyleHandler;
86
106
  Lcom/swmansion/enriched/markdown/input/styles/LinkStyleHandler;
107
+ Lcom/swmansion/enriched/markdown/input/styles/MarkdownBoldColorSpan;
108
+ Lcom/swmansion/enriched/markdown/input/styles/MarkdownBoldSpan;
109
+ Lcom/swmansion/enriched/markdown/input/styles/MarkdownItalicColorSpan;
110
+ Lcom/swmansion/enriched/markdown/input/styles/MarkdownItalicSpan;
111
+ Lcom/swmansion/enriched/markdown/input/styles/MarkdownLinkBackgroundColorSpan;
112
+ Lcom/swmansion/enriched/markdown/input/styles/MarkdownLinkColorSpan;
113
+ Lcom/swmansion/enriched/markdown/input/styles/MarkdownLinkColorSpan$ResolvedLinkStyle;
114
+ Lcom/swmansion/enriched/markdown/input/styles/MarkdownLinkUnderlineSpan;
115
+ Lcom/swmansion/enriched/markdown/input/styles/MarkdownSpoilerBackgroundSpan;
116
+ Lcom/swmansion/enriched/markdown/input/styles/MarkdownSpoilerColorSpan;
117
+ Lcom/swmansion/enriched/markdown/input/styles/MarkdownStrikethroughSpan;
118
+ Lcom/swmansion/enriched/markdown/input/styles/MarkdownUnderlineSpan;
87
119
  Lcom/swmansion/enriched/markdown/input/styles/SpoilerStyleHandler;
88
120
  Lcom/swmansion/enriched/markdown/input/styles/StrikethroughStyleHandler;
89
121
  Lcom/swmansion/enriched/markdown/input/styles/StyleHandler;
@@ -91,33 +123,42 @@ Lcom/swmansion/enriched/markdown/input/styles/StyleMergingConfig;
91
123
  Lcom/swmansion/enriched/markdown/input/styles/UnderlineStyleHandler;
92
124
 
93
125
  # Input - Toolbar
126
+ Lcom/swmansion/enriched/markdown/input/toolbar/FormatMenuConfig;
94
127
  Lcom/swmansion/enriched/markdown/input/toolbar/InputContextMenu;
128
+ Lcom/swmansion/enriched/markdown/input/toolbar/InputSelectionMenuConfig;
95
129
 
96
130
  # Parser
97
131
  Lcom/swmansion/enriched/markdown/parser/Md4cFlags;
98
132
  Lcom/swmansion/enriched/markdown/parser/MarkdownASTNode;
99
133
  Lcom/swmansion/enriched/markdown/parser/MarkdownASTNode$NodeType;
134
+ Lcom/swmansion/enriched/markdown/parser/MarkdownASTNodeKt;
100
135
  Lcom/swmansion/enriched/markdown/parser/Parser;
101
136
 
102
137
  # Renderer Classes
103
138
  Lcom/swmansion/enriched/markdown/renderer/BaselineShiftRenderer;
104
139
  Lcom/swmansion/enriched/markdown/renderer/BlockStyle;
105
140
  Lcom/swmansion/enriched/markdown/renderer/BlockStyleContext;
141
+ Lcom/swmansion/enriched/markdown/renderer/BlockStyleEntry;
106
142
  Lcom/swmansion/enriched/markdown/renderer/BlockType;
143
+ Lcom/swmansion/enriched/markdown/renderer/BlockType$ListType;
107
144
  Lcom/swmansion/enriched/markdown/renderer/BlockquoteRenderer;
108
145
  Lcom/swmansion/enriched/markdown/renderer/CodeBlockRenderer;
146
+ Lcom/swmansion/enriched/markdown/renderer/CodeBlockRenderer$CodeBlockBoundaryPaddingSpan;
109
147
  Lcom/swmansion/enriched/markdown/renderer/CodeRenderer;
110
148
  Lcom/swmansion/enriched/markdown/renderer/DocumentRenderer;
111
149
  Lcom/swmansion/enriched/markdown/renderer/EmphasisRenderer;
112
150
  Lcom/swmansion/enriched/markdown/renderer/HeadingRenderer;
151
+ Lcom/swmansion/enriched/markdown/renderer/HighlightRenderer;
113
152
  Lcom/swmansion/enriched/markdown/renderer/ImageRenderer;
114
153
  Lcom/swmansion/enriched/markdown/renderer/LineBreakRenderer;
115
154
  Lcom/swmansion/enriched/markdown/renderer/LinkRenderer;
116
155
  Lcom/swmansion/enriched/markdown/renderer/ListContextManager;
156
+ Lcom/swmansion/enriched/markdown/renderer/ListContextManager$ListEntryState;
117
157
  Lcom/swmansion/enriched/markdown/renderer/ListItemRenderer;
118
158
  Lcom/swmansion/enriched/markdown/renderer/ListRenderer;
119
159
  Lcom/swmansion/enriched/markdown/renderer/MathInlineRenderer;
120
160
  Lcom/swmansion/enriched/markdown/renderer/NodeRenderer;
161
+ Lcom/swmansion/enriched/markdown/renderer/NodeRenderer$DeferredSpan;
121
162
  Lcom/swmansion/enriched/markdown/renderer/ParagraphRenderer;
122
163
  Lcom/swmansion/enriched/markdown/renderer/Renderer;
123
164
  Lcom/swmansion/enriched/markdown/renderer/RendererConfig;
@@ -126,12 +167,15 @@ Lcom/swmansion/enriched/markdown/renderer/SpanStyleCache;
126
167
  Lcom/swmansion/enriched/markdown/renderer/SpoilerRenderer;
127
168
  Lcom/swmansion/enriched/markdown/renderer/StrikethroughRenderer;
128
169
  Lcom/swmansion/enriched/markdown/renderer/StrongRenderer;
170
+ Lcom/swmansion/enriched/markdown/renderer/SubscriptRenderer;
171
+ Lcom/swmansion/enriched/markdown/renderer/SuperscriptRenderer;
129
172
  Lcom/swmansion/enriched/markdown/renderer/TextRenderer;
130
173
  Lcom/swmansion/enriched/markdown/renderer/ThematicBreakRenderer;
131
174
  Lcom/swmansion/enriched/markdown/renderer/UnderlineRenderer;
132
175
 
133
176
  # Spans
134
177
  Lcom/swmansion/enriched/markdown/spans/BaselineShiftSpan;
178
+ Lcom/swmansion/enriched/markdown/spans/BaselineShiftSpan$SpanType;
135
179
  Lcom/swmansion/enriched/markdown/spans/BaseListSpan;
136
180
  Lcom/swmansion/enriched/markdown/spans/BlockquoteSpan;
137
181
  Lcom/swmansion/enriched/markdown/spans/CodeBackgroundSpan;
@@ -140,7 +184,10 @@ Lcom/swmansion/enriched/markdown/spans/CodeSpan;
140
184
  Lcom/swmansion/enriched/markdown/spans/EmphasisSpan;
141
185
  Lcom/swmansion/enriched/markdown/spans/FadeInSpan;
142
186
  Lcom/swmansion/enriched/markdown/spans/HeadingSpan;
187
+ Lcom/swmansion/enriched/markdown/spans/HighlightSpan;
143
188
  Lcom/swmansion/enriched/markdown/spans/ImageSpan;
189
+ Lcom/swmansion/enriched/markdown/spans/ImageSpan$CacheKey;
190
+ Lcom/swmansion/enriched/markdown/spans/ImageSpan$ScaledImageDrawable;
144
191
  Lcom/swmansion/enriched/markdown/spans/LineHeightSpan;
145
192
  Lcom/swmansion/enriched/markdown/spans/LinkSpan;
146
193
  Lcom/swmansion/enriched/markdown/spans/MarginBottomSpan;
@@ -163,6 +210,7 @@ Lcom/swmansion/enriched/markdown/spoiler/ParticleStrategy;
163
210
  Lcom/swmansion/enriched/markdown/spoiler/SegmentKey;
164
211
  Lcom/swmansion/enriched/markdown/spoiler/SegmentRect;
165
212
  Lcom/swmansion/enriched/markdown/spoiler/SolidStrategy;
213
+ Lcom/swmansion/enriched/markdown/spoiler/SolidStrategy$SegmentState;
166
214
  Lcom/swmansion/enriched/markdown/spoiler/SpoilerAnimator;
167
215
  Lcom/swmansion/enriched/markdown/spoiler/SpoilerCapable;
168
216
  Lcom/swmansion/enriched/markdown/spoiler/SpoilerConstantsKt;
@@ -171,6 +219,8 @@ Lcom/swmansion/enriched/markdown/spoiler/SpoilerDrawUtilsKt;
171
219
  Lcom/swmansion/enriched/markdown/spoiler/SpoilerOverlay;
172
220
  Lcom/swmansion/enriched/markdown/spoiler/SpoilerOverlayDrawer;
173
221
  Lcom/swmansion/enriched/markdown/spoiler/SpoilerParticleDrawable;
222
+ Lcom/swmansion/enriched/markdown/spoiler/SpoilerParticleDrawable$DotType;
223
+ Lcom/swmansion/enriched/markdown/spoiler/SpoilerStrategy;
174
224
  Lcom/swmansion/enriched/markdown/spoiler/SpoilerStrategyKt;
175
225
 
176
226
  # Style Configuration
@@ -180,6 +230,7 @@ Lcom/swmansion/enriched/markdown/styles/CodeBlockStyle;
180
230
  Lcom/swmansion/enriched/markdown/styles/CodeStyle;
181
231
  Lcom/swmansion/enriched/markdown/styles/EmphasisStyle;
182
232
  Lcom/swmansion/enriched/markdown/styles/HeadingStyle;
233
+ Lcom/swmansion/enriched/markdown/styles/HighlightStyle;
183
234
  Lcom/swmansion/enriched/markdown/styles/ImageStyle;
184
235
  Lcom/swmansion/enriched/markdown/styles/InlineImageStyle;
185
236
  Lcom/swmansion/enriched/markdown/styles/InlineMathStyle;
@@ -202,19 +253,26 @@ Lcom/swmansion/enriched/markdown/styles/ThematicBreakStyle;
202
253
  Lcom/swmansion/enriched/markdown/styles/UnderlineStyle;
203
254
 
204
255
  # Utilities - Common
256
+ Lcom/swmansion/enriched/markdown/utils/common/BreakStrategyUtils;
205
257
  Lcom/swmansion/enriched/markdown/utils/common/FeatureFlags;
206
258
  Lcom/swmansion/enriched/markdown/utils/common/MarkdownSegment;
207
259
  Lcom/swmansion/enriched/markdown/utils/common/MarkdownSegment$Math;
208
260
  Lcom/swmansion/enriched/markdown/utils/common/MarkdownSegment$Table;
209
261
  Lcom/swmansion/enriched/markdown/utils/common/MarkdownSegment$Text;
210
262
  Lcom/swmansion/enriched/markdown/utils/common/MarkdownSegmentKt;
263
+ Lcom/swmansion/enriched/markdown/utils/common/MarkdownSegmentRenderer;
211
264
  Lcom/swmansion/enriched/markdown/utils/common/MarkdownViewManagerUtilsKt;
265
+ Lcom/swmansion/enriched/markdown/utils/common/MotionPreferencesKt;
212
266
  Lcom/swmansion/enriched/markdown/utils/common/ReadableMapExtensionsKt;
267
+ Lcom/swmansion/enriched/markdown/utils/common/ReconciliationResult;
213
268
  Lcom/swmansion/enriched/markdown/utils/common/RenderedSegment;
214
269
  Lcom/swmansion/enriched/markdown/utils/common/RenderedSegment$Math;
215
270
  Lcom/swmansion/enriched/markdown/utils/common/RenderedSegment$Table;
216
271
  Lcom/swmansion/enriched/markdown/utils/common/RenderedSegment$Text;
217
- Lcom/swmansion/enriched/markdown/utils/common/RenderedSegmentKt;
272
+ Lcom/swmansion/enriched/markdown/utils/common/SegmentReconciler;
273
+ Lcom/swmansion/enriched/markdown/utils/common/SegmentSignature;
274
+ Lcom/swmansion/enriched/markdown/utils/common/StreamingMarkdownFilter;
275
+ Lcom/swmansion/enriched/markdown/utils/common/TableStreamingMode;
218
276
  Lcom/swmansion/enriched/markdown/utils/common/layout/RTLUtilsKt;
219
277
  Lcom/swmansion/enriched/markdown/utils/common/serialization/MarkdownASTSerializer;
220
278
 
@@ -228,27 +286,42 @@ Lcom/swmansion/enriched/markdown/utils/text/ImageCache;
228
286
  Lcom/swmansion/enriched/markdown/utils/text/ImageDownloader;
229
287
  Lcom/swmansion/enriched/markdown/utils/text/TailFadeInAnimator;
230
288
  Lcom/swmansion/enriched/markdown/utils/text/conversion/HTMLGenerator;
289
+ Lcom/swmansion/enriched/markdown/utils/text/conversion/HTMLGenerator$CachedStyles;
290
+ Lcom/swmansion/enriched/markdown/utils/text/conversion/HTMLGenerator$GeneratorState;
291
+ Lcom/swmansion/enriched/markdown/utils/text/conversion/HTMLGenerator$ParagraphInfo;
231
292
  Lcom/swmansion/enriched/markdown/utils/text/conversion/MarkdownExtractor;
293
+ Lcom/swmansion/enriched/markdown/utils/text/conversion/MarkdownExtractor$ExtractionState;
294
+ Lcom/swmansion/enriched/markdown/utils/text/conversion/MarkdownExtractor$HeadingAccumulator;
232
295
  Lcom/swmansion/enriched/markdown/utils/text/extensions/ParagraphUtilsKt;
233
296
  Lcom/swmansion/enriched/markdown/utils/text/extensions/SpannableExtensionsKt;
234
297
  Lcom/swmansion/enriched/markdown/utils/text/extensions/TextPaintExtensionsKt;
235
298
  Lcom/swmansion/enriched/markdown/utils/text/interaction/CheckboxTouchHelper;
236
299
  Lcom/swmansion/enriched/markdown/utils/text/interaction/TaskListHitTestResult;
237
300
  Lcom/swmansion/enriched/markdown/utils/text/interaction/TaskListTapUtils;
238
- Lcom/swmansion/enriched/markdown/utils/text/interaction/TaskListTapUtilsKt;
239
301
  Lcom/swmansion/enriched/markdown/utils/text/interaction/TaskListToggleUtils;
240
302
  Lcom/swmansion/enriched/markdown/utils/text/span/BlockSpacingKt;
241
303
  Lcom/swmansion/enriched/markdown/utils/text/span/SpanFlagsKt;
242
304
  Lcom/swmansion/enriched/markdown/utils/text/view/LinkEventsKt;
243
305
  Lcom/swmansion/enriched/markdown/utils/text/view/LinkLongPressMovementMethod;
244
306
  Lcom/swmansion/enriched/markdown/utils/text/view/SelectionActionModeKt;
307
+ Lcom/swmansion/enriched/markdown/utils/text/view/SelectionMenuConfig;
308
+ Lcom/swmansion/enriched/markdown/utils/text/view/TextSelectionColorsKt;
245
309
  Lcom/swmansion/enriched/markdown/utils/text/view/TextViewSetupKt;
246
310
 
247
311
  # Views
248
312
  Lcom/swmansion/enriched/markdown/views/BlockSegmentView;
249
313
  Lcom/swmansion/enriched/markdown/views/ContextMenuPopup;
314
+ Lcom/swmansion/enriched/markdown/views/ContextMenuPopup$Builder;
315
+ Lcom/swmansion/enriched/markdown/views/ContextMenuPopup$Icon;
316
+ Lcom/swmansion/enriched/markdown/views/ContextMenuPopup$MenuItem;
250
317
  Lcom/swmansion/enriched/markdown/views/MathContainerView;
251
318
  Lcom/swmansion/enriched/markdown/views/TableContainerView;
319
+ Lcom/swmansion/enriched/markdown/views/TableContainerView$CellBackgroundView;
320
+ Lcom/swmansion/enriched/markdown/views/TableContainerView$CellTextView;
321
+ Lcom/swmansion/enriched/markdown/views/TableContainerView$GridContainerView;
322
+ Lcom/swmansion/enriched/markdown/views/TableContainerView$HeaderTypefaceSpan;
323
+ Lcom/swmansion/enriched/markdown/views/TableContainerView$TableCellData;
252
324
 
253
325
  # Math (optional, from src/math source set)
254
326
  Lcom/swmansion/enriched/markdown/spans/MathMeasureHelper;
327
+ Lcom/swmansion/enriched/markdown/views/MathContainerView$RaTeXCanvasView;
@@ -10,6 +10,7 @@ import android.util.Log
10
10
  import android.view.View
11
11
  import android.widget.FrameLayout
12
12
  import com.facebook.react.bridge.ReadableMap
13
+ import com.swmansion.enriched.markdown.accessibility.AccessibilityLabels
13
14
  import com.swmansion.enriched.markdown.parser.Md4cFlags
14
15
  import com.swmansion.enriched.markdown.parser.Parser
15
16
  import com.swmansion.enriched.markdown.spoiler.SpoilerOverlay
@@ -82,6 +83,7 @@ class EnrichedMarkdown
82
83
  private var selectionColor: Int? = null
83
84
  private var selectionHandleColor: Int? = null
84
85
  private var selectionMenuConfig = SelectionMenuConfig()
86
+ private var accessibilityLabels = AccessibilityLabels()
85
87
  private var textBreakStrategy: String = BreakStrategyUtils.DEFAULT_STRATEGY
86
88
 
87
89
  private var onLinkPressCallback: ((String) -> Unit)? = null
@@ -232,6 +234,51 @@ class EnrichedMarkdown
232
234
  segmentViews.filterIsInstance<EnrichedMarkdownInternalText>().forEach {
233
235
  it.selectionMenuConfig = config
234
236
  }
237
+ // Table and math views cache the copy labels, so re-push them on update
238
+ // (e.g. a language change without a remount) to avoid stale labels.
239
+ pushCopyLabelsToBlockSegments()
240
+ }
241
+
242
+ private fun pushCopyLabelsToBlockSegments() {
243
+ val copyLabel = selectionMenuConfig.copyLabel
244
+ val copyAsMarkdownLabel = selectionMenuConfig.copyAsMarkdownLabel
245
+ segmentViews.forEach { view ->
246
+ when {
247
+ view is TableContainerView -> {
248
+ view.copyLabel = copyLabel
249
+ view.copyAsMarkdownLabel = copyAsMarkdownLabel
250
+ }
251
+
252
+ isMathContainerView(view) -> {
253
+ runCatching {
254
+ view.javaClass.getMethod("setCopyLabel", String::class.java).invoke(view, copyLabel)
255
+ view.javaClass
256
+ .getMethod("setCopyAsMarkdownLabel", String::class.java)
257
+ .invoke(view, copyAsMarkdownLabel)
258
+ }
259
+ }
260
+ }
261
+ }
262
+ }
263
+
264
+ fun setAccessibilityLabels(labels: AccessibilityLabels) {
265
+ if (accessibilityLabels == labels) return
266
+ accessibilityLabels = labels
267
+ segmentViews.filterIsInstance<EnrichedMarkdownInternalText>().forEach {
268
+ it.accessibilityLabels = labels
269
+ }
270
+ segmentViews.filterIsInstance<TableContainerView>().forEach {
271
+ it.accessibilityLabels = labels
272
+ }
273
+ mathContainerClass?.let { mathClass ->
274
+ segmentViews.filter { mathClass.isInstance(it) }.forEach { view ->
275
+ runCatching {
276
+ mathClass
277
+ .getMethod("setAccessibilityLabels", AccessibilityLabels::class.java)
278
+ .invoke(view, labels)
279
+ }
280
+ }
281
+ }
235
282
  }
236
283
 
237
284
  private fun forwardContextMenuItemPress(
@@ -433,6 +480,7 @@ class EnrichedMarkdown
433
480
  EnrichedMarkdownInternalText(context).apply {
434
481
  spoilerOverlay = this@EnrichedMarkdown.spoilerOverlay
435
482
  selectionMenuConfig = this@EnrichedMarkdown.selectionMenuConfig
483
+ accessibilityLabels = this@EnrichedMarkdown.accessibilityLabels
436
484
  setIsSelectable(selectable)
437
485
  if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
438
486
  breakStrategy = BreakStrategyUtils.resolveBreakStrategy(textBreakStrategy)
@@ -461,8 +509,11 @@ class EnrichedMarkdown
461
509
  ) = TableContainerView(context, style).apply {
462
510
  allowFontScaling = this@EnrichedMarkdown.allowFontScaling
463
511
  maxFontSizeMultiplier = this@EnrichedMarkdown.maxFontSizeMultiplier
512
+ accessibilityLabels = this@EnrichedMarkdown.accessibilityLabels
464
513
  onLinkPress = onLinkPressCallback
465
514
  onLinkLongPress = onLinkLongPressCallback
515
+ copyLabel = this@EnrichedMarkdown.selectionMenuConfig.copyLabel
516
+ copyAsMarkdownLabel = this@EnrichedMarkdown.selectionMenuConfig.copyAsMarkdownLabel
466
517
  applyTableNode(segment.node)
467
518
  }
468
519
 
@@ -477,6 +528,17 @@ class EnrichedMarkdown
477
528
  resolvedClass
478
529
  .getConstructor(Context::class.java, StyleConfig::class.java)
479
530
  .newInstance(context, style) as View
531
+ runCatching {
532
+ resolvedClass
533
+ .getMethod("setAccessibilityLabels", AccessibilityLabels::class.java)
534
+ .invoke(view, accessibilityLabels)
535
+ }
536
+ resolvedClass
537
+ .getMethod("setCopyLabel", String::class.java)
538
+ .invoke(view, selectionMenuConfig.copyLabel)
539
+ resolvedClass
540
+ .getMethod("setCopyAsMarkdownLabel", String::class.java)
541
+ .invoke(view, selectionMenuConfig.copyAsMarkdownLabel)
480
542
  resolvedClass.getMethod("applyLatex", String::class.java).invoke(view, segment.latex)
481
543
  view
482
544
  } catch (e: Exception) {
@@ -6,6 +6,7 @@ import android.os.Build
6
6
  import android.text.Layout
7
7
  import android.util.AttributeSet
8
8
  import android.view.MotionEvent
9
+ import com.swmansion.enriched.markdown.accessibility.AccessibilityLabels
9
10
  import com.swmansion.enriched.markdown.accessibility.AccessibleMarkdownTextView
10
11
  import com.swmansion.enriched.markdown.spoiler.SpoilerCapable
11
12
  import com.swmansion.enriched.markdown.spoiler.SpoilerOverlay
@@ -17,6 +18,7 @@ import com.swmansion.enriched.markdown.utils.text.view.applySelectableState
17
18
  import com.swmansion.enriched.markdown.utils.text.view.cancelJSTouchForCheckboxTap
18
19
  import com.swmansion.enriched.markdown.utils.text.view.cancelJSTouchForLinkTap
19
20
  import com.swmansion.enriched.markdown.utils.text.view.createSelectionActionModeCallback
21
+ import com.swmansion.enriched.markdown.utils.text.view.reallowParentInterceptIfLinkReleased
20
22
  import com.swmansion.enriched.markdown.utils.text.view.setupAsMarkdownTextView
21
23
  import com.swmansion.enriched.markdown.views.BlockSegmentView
22
24
 
@@ -47,6 +49,11 @@ class EnrichedMarkdownInternalText
47
49
  private var contextMenuItemTexts: List<String> = emptyList()
48
50
  private var onContextMenuItemPress: ((itemText: String, selectedText: String, selectionStart: Int, selectionEnd: Int) -> Unit)? = null
49
51
  var selectionMenuConfig: SelectionMenuConfig = SelectionMenuConfig()
52
+ var accessibilityLabels: AccessibilityLabels = AccessibilityLabels()
53
+ set(value) {
54
+ field = value
55
+ accessibilityHelper.labels = value
56
+ }
50
57
 
51
58
  init {
52
59
  setupAsMarkdownTextView()
@@ -103,8 +110,9 @@ class EnrichedMarkdownInternalText
103
110
  return true
104
111
  }
105
112
  val result = super.onTouchEvent(event)
106
- if (event.action == MotionEvent.ACTION_DOWN) {
107
- cancelJSTouchForLinkTap(event)
113
+ when (event.action) {
114
+ MotionEvent.ACTION_DOWN -> cancelJSTouchForLinkTap(event)
115
+ else -> reallowParentInterceptIfLinkReleased()
108
116
  }
109
117
  return result
110
118
  }
@@ -18,6 +18,7 @@ import com.swmansion.enriched.markdown.utils.common.emitLinkLongPress
18
18
  import com.swmansion.enriched.markdown.utils.common.emitLinkPress
19
19
  import com.swmansion.enriched.markdown.utils.common.emitTaskListItemPress
20
20
  import com.swmansion.enriched.markdown.utils.common.markdownEventTypeConstants
21
+ import com.swmansion.enriched.markdown.utils.common.parseAccessibilityLabels
21
22
  import com.swmansion.enriched.markdown.utils.common.parseContextMenuItems
22
23
  import com.swmansion.enriched.markdown.utils.common.parseMd4cFlags
23
24
  import com.swmansion.enriched.markdown.utils.common.parseSelectionMenuConfig
@@ -223,6 +224,15 @@ class EnrichedMarkdownManager :
223
224
  view.setSelectionMenuConfig(parseSelectionMenuConfig(value))
224
225
  }
225
226
 
227
+ @ReactProp(name = "accessibilityLabels")
228
+ override fun setAccessibilityLabels(
229
+ view: EnrichedMarkdown?,
230
+ value: ReadableMap?,
231
+ ) {
232
+ if (view == null) return
233
+ view.setAccessibilityLabels(parseAccessibilityLabels(value))
234
+ }
235
+
226
236
  override fun setPadding(
227
237
  view: EnrichedMarkdown,
228
238
  left: Int,
@@ -11,6 +11,7 @@ import android.util.AttributeSet
11
11
  import android.util.Log
12
12
  import android.view.MotionEvent
13
13
  import com.facebook.react.bridge.ReadableMap
14
+ import com.swmansion.enriched.markdown.accessibility.AccessibilityLabels
14
15
  import com.swmansion.enriched.markdown.accessibility.AccessibleMarkdownTextView
15
16
  import com.swmansion.enriched.markdown.parser.Md4cFlags
16
17
  import com.swmansion.enriched.markdown.parser.Parser
@@ -31,6 +32,7 @@ import com.swmansion.enriched.markdown.utils.text.view.cancelJSTouchForLinkTap
31
32
  import com.swmansion.enriched.markdown.utils.text.view.createSelectionActionModeCallback
32
33
  import com.swmansion.enriched.markdown.utils.text.view.emitLinkLongPressEvent
33
34
  import com.swmansion.enriched.markdown.utils.text.view.emitLinkPressEvent
35
+ import com.swmansion.enriched.markdown.utils.text.view.reallowParentInterceptIfLinkReleased
34
36
  import com.swmansion.enriched.markdown.utils.text.view.setupAsMarkdownTextView
35
37
  import java.util.concurrent.Executors
36
38
 
@@ -275,6 +277,10 @@ class EnrichedMarkdownText
275
277
  selectionMenuConfig = config
276
278
  }
277
279
 
280
+ fun setAccessibilityLabels(labels: AccessibilityLabels) {
281
+ accessibilityHelper.labels = labels
282
+ }
283
+
278
284
  fun setIsSelectable(selectable: Boolean) {
279
285
  applySelectableState(selectable)
280
286
  }
@@ -351,8 +357,9 @@ class EnrichedMarkdownText
351
357
  return true
352
358
  }
353
359
  val result = super.onTouchEvent(event)
354
- if (event.action == MotionEvent.ACTION_DOWN) {
355
- cancelJSTouchForLinkTap(event)
360
+ when (event.action) {
361
+ MotionEvent.ACTION_DOWN -> cancelJSTouchForLinkTap(event)
362
+ else -> reallowParentInterceptIfLinkReleased()
356
363
  }
357
364
  return result
358
365
  }
@@ -17,6 +17,7 @@ import com.swmansion.enriched.markdown.utils.common.emitLinkLongPress
17
17
  import com.swmansion.enriched.markdown.utils.common.emitLinkPress
18
18
  import com.swmansion.enriched.markdown.utils.common.emitTaskListItemPress
19
19
  import com.swmansion.enriched.markdown.utils.common.markdownEventTypeConstants
20
+ import com.swmansion.enriched.markdown.utils.common.parseAccessibilityLabels
20
21
  import com.swmansion.enriched.markdown.utils.common.parseContextMenuItems
21
22
  import com.swmansion.enriched.markdown.utils.common.parseMd4cFlags
22
23
  import com.swmansion.enriched.markdown.utils.common.parseSelectionMenuConfig
@@ -221,6 +222,15 @@ class EnrichedMarkdownTextManager :
221
222
  view.setSelectionMenuConfig(parseSelectionMenuConfig(value))
222
223
  }
223
224
 
225
+ @ReactProp(name = "accessibilityLabels")
226
+ override fun setAccessibilityLabels(
227
+ view: EnrichedMarkdownText?,
228
+ value: ReadableMap?,
229
+ ) {
230
+ if (view == null) return
231
+ view.setAccessibilityLabels(parseAccessibilityLabels(value))
232
+ }
233
+
224
234
  override fun setPadding(
225
235
  view: EnrichedMarkdownText,
226
236
  left: Int,
@@ -0,0 +1,15 @@
1
+ package com.swmansion.enriched.markdown.accessibility
2
+
3
+ data class AccessibilityLabels(
4
+ val bulletPoint: String = "",
5
+ val nestedBulletPoint: String = "",
6
+ val orderedItem: String = "",
7
+ val nestedOrderedItem: String = "",
8
+ val blockquote: String = "",
9
+ val nestedBlockquote: String = "",
10
+ val tableRow: String = "",
11
+ val mathEquation: String = "",
12
+ val rotorHeadings: String = "",
13
+ val rotorLinks: String = "",
14
+ val rotorImages: String = "",
15
+ )
@@ -10,6 +10,7 @@ import androidx.core.view.ViewCompat
10
10
  import androidx.core.view.accessibility.AccessibilityNodeInfoCompat
11
11
  import androidx.customview.widget.ExploreByTouchHelper
12
12
  import com.swmansion.enriched.markdown.spans.BaseListSpan
13
+ import com.swmansion.enriched.markdown.spans.BlockquoteSpan
13
14
  import com.swmansion.enriched.markdown.spans.HeadingSpan
14
15
  import com.swmansion.enriched.markdown.spans.ImageSpan
15
16
  import com.swmansion.enriched.markdown.spans.LinkSpan
@@ -23,6 +24,13 @@ class MarkdownAccessibilityHelper(
23
24
  private var lastLayoutHashCode = 0
24
25
  private var pendingLayoutListener: ViewTreeObserver.OnGlobalLayoutListener? = null
25
26
 
27
+ var labels: AccessibilityLabels = AccessibilityLabels()
28
+ set(value) {
29
+ if (field == value) return
30
+ field = value
31
+ invalidateAccessibilityItems()
32
+ }
33
+
26
34
  data class AccessibilityItem(
27
35
  val id: Int,
28
36
  val text: String,
@@ -184,7 +192,7 @@ class MarkdownAccessibilityHelper(
184
192
  }
185
193
 
186
194
  // The semantic span itself
187
- val content = span.imageAltText?.ifEmpty { "Image" } ?: spanned.substring(span.start, span.end).trim()
195
+ val content = span.imageAltText ?: spanned.substring(span.start, span.end).trim()
188
196
  if (content.isNotEmpty()) {
189
197
  items.add(createSpanItem(nextId++, content, span, spanned))
190
198
  }
@@ -322,32 +330,61 @@ class MarkdownAccessibilityHelper(
322
330
  )
323
331
  }
324
332
 
333
+ val blockquoteAnnouncement = blockquoteAnnouncementFor(item)
325
334
  when {
326
335
  item.isHeading -> {
327
336
  isHeading = true
328
- contentDescription = "${item.text}, heading level ${item.headingLevel}"
337
+ if (blockquoteAnnouncement != null) {
338
+ roleDescription = blockquoteAnnouncement
339
+ }
329
340
  }
330
341
 
331
342
  item.isImage -> {
332
- roleDescription = "image"
343
+ roleDescription = appendBlockquote("image", blockquoteAnnouncement)
333
344
  }
334
345
 
335
346
  item.isLink -> {
336
347
  isClickable = true
337
348
  addAction(AccessibilityNodeInfoCompat.AccessibilityActionCompat.ACTION_CLICK)
338
- roleDescription = item.listInfo?.let { "link, ${it.listAnnouncement}" } ?: "link"
349
+ val base = item.listInfo?.let { "link, ${it.listAnnouncement}" } ?: "link"
350
+ roleDescription = appendBlockquote(base, blockquoteAnnouncement)
339
351
  }
340
352
 
341
353
  item.isListItem -> {
342
- roleDescription = item.listInfo!!.listAnnouncement
354
+ roleDescription = appendBlockquote(item.listInfo!!.listAnnouncement, blockquoteAnnouncement)
355
+ }
356
+
357
+ blockquoteAnnouncement != null -> {
358
+ roleDescription = blockquoteAnnouncement
343
359
  }
344
360
  }
345
361
  }
346
362
 
363
+ private fun appendBlockquote(
364
+ base: String,
365
+ blockquoteAnnouncement: String?,
366
+ ): String = if (blockquoteAnnouncement != null) "$base, $blockquoteAnnouncement" else base
367
+
368
+ private fun blockquoteAnnouncementFor(item: AccessibilityItem): String? {
369
+ val spanned = textView.text as? Spanned ?: return null
370
+ if (spanned.isEmpty()) return null
371
+ val pos = item.start.coerceIn(0, spanned.length - 1).coerceAtLeast(0)
372
+ if (pos >= spanned.length) return null
373
+ val spans = spanned.getSpans(pos, pos + 1, BlockquoteSpan::class.java)
374
+ if (spans.isEmpty()) return null
375
+ val maxDepth = spans.maxOf { it.depth }
376
+ return if (maxDepth >= 1) labels.nestedBlockquote else labels.blockquote
377
+ }
378
+
347
379
  private val ListItemInfo.listAnnouncement: String
348
380
  get() {
349
- val prefix = if (depth > 0) "nested " else ""
350
- return if (isOrdered) "${prefix}list item $itemNumber" else "${prefix}bullet point"
381
+ val nested = depth > 0
382
+ return if (isOrdered) {
383
+ val template = if (nested) labels.nestedOrderedItem else labels.orderedItem
384
+ template.replace("{n}", itemNumber.toString())
385
+ } else {
386
+ if (nested) labels.nestedBulletPoint else labels.bulletPoint
387
+ }
351
388
  }
352
389
 
353
390
  private fun boundsForItem(item: AccessibilityItem): Rect {