@mathers101/react-native-render-rich-text 0.0.0-stage → 0.1.10

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 (358) hide show
  1. package/LICENSE +20 -0
  2. package/README.md +140 -3
  3. package/ReactNativeRenderRichText.podspec +23 -0
  4. package/android/build.gradle +86 -0
  5. package/android/consumer-rules.pro +3 -0
  6. package/android/src/main/AndroidManifest.xml +2 -0
  7. package/android/src/main/cpp/jni-adapter.cpp +191 -0
  8. package/android/src/main/java/com/renderrichtext/EnrichedTiptapText.kt +673 -0
  9. package/android/src/main/java/com/renderrichtext/EnrichedTiptapTextLayoutManager.kt +24 -0
  10. package/android/src/main/java/com/renderrichtext/EnrichedTiptapTextManager.kt +405 -0
  11. package/android/src/main/java/com/renderrichtext/EnrichedTiptapTextPackage.kt +13 -0
  12. package/android/src/main/java/com/renderrichtext/MeasurementStore.kt +644 -0
  13. package/android/src/main/java/com/renderrichtext/accessibility/AccessibilityLabels.kt +17 -0
  14. package/android/src/main/java/com/renderrichtext/accessibility/AccessibleTiptapTextView.kt +112 -0
  15. package/android/src/main/java/com/renderrichtext/accessibility/TiptapAccessibilityHelper.kt +576 -0
  16. package/android/src/main/java/com/renderrichtext/events/CodeBlockPressEvent.kt +24 -0
  17. package/android/src/main/java/com/renderrichtext/events/ContextMenuItemPressEvent.kt +28 -0
  18. package/android/src/main/java/com/renderrichtext/events/CopyPressEvent.kt +24 -0
  19. package/android/src/main/java/com/renderrichtext/events/FactoidPressEvent.kt +23 -0
  20. package/android/src/main/java/com/renderrichtext/events/ImagePressEvent.kt +25 -0
  21. package/android/src/main/java/com/renderrichtext/events/LatexErrorEvent.kt +29 -0
  22. package/android/src/main/java/com/renderrichtext/events/LinkLongPressEvent.kt +23 -0
  23. package/android/src/main/java/com/renderrichtext/events/LinkPressEvent.kt +23 -0
  24. package/android/src/main/java/com/renderrichtext/events/MentionLongPressEvent.kt +25 -0
  25. package/android/src/main/java/com/renderrichtext/events/MentionPressEvent.kt +25 -0
  26. package/android/src/main/java/com/renderrichtext/events/TaskListItemPressEvent.kt +26 -0
  27. package/android/src/main/java/com/renderrichtext/math/LatexErrorReporter.kt +9 -0
  28. package/android/src/main/java/com/renderrichtext/parser/Parser.kt +59 -0
  29. package/android/src/main/java/com/renderrichtext/parser/TextLinkMatching.kt +35 -0
  30. package/android/src/main/java/com/renderrichtext/parser/TiptapASTNode.kt +69 -0
  31. package/android/src/main/java/com/renderrichtext/renderer/BaselineShiftRenderer.kt +45 -0
  32. package/android/src/main/java/com/renderrichtext/renderer/BlankLineRenderer.kt +39 -0
  33. package/android/src/main/java/com/renderrichtext/renderer/BlockStyleContext.kt +181 -0
  34. package/android/src/main/java/com/renderrichtext/renderer/BlockquoteRenderer.kt +243 -0
  35. package/android/src/main/java/com/renderrichtext/renderer/BlockquoteTextRenderer.kt +56 -0
  36. package/android/src/main/java/com/renderrichtext/renderer/CodeBlockRenderer.kt +135 -0
  37. package/android/src/main/java/com/renderrichtext/renderer/CodeRenderer.kt +37 -0
  38. package/android/src/main/java/com/renderrichtext/renderer/EmphasisRenderer.kt +28 -0
  39. package/android/src/main/java/com/renderrichtext/renderer/FactoidRenderer.kt +97 -0
  40. package/android/src/main/java/com/renderrichtext/renderer/HeadingRenderer.kt +81 -0
  41. package/android/src/main/java/com/renderrichtext/renderer/HighlightRenderer.kt +26 -0
  42. package/android/src/main/java/com/renderrichtext/renderer/LineBreakRenderer.kt +17 -0
  43. package/android/src/main/java/com/renderrichtext/renderer/LinkRenderer.kt +90 -0
  44. package/android/src/main/java/com/renderrichtext/renderer/ListContextManager.kt +109 -0
  45. package/android/src/main/java/com/renderrichtext/renderer/ListItemRenderer.kt +211 -0
  46. package/android/src/main/java/com/renderrichtext/renderer/ListRenderer.kt +133 -0
  47. package/android/src/main/java/com/renderrichtext/renderer/MentionRenderer.kt +85 -0
  48. package/android/src/main/java/com/renderrichtext/renderer/NodeRenderer.kt +207 -0
  49. package/android/src/main/java/com/renderrichtext/renderer/ParagraphRenderer.kt +91 -0
  50. package/android/src/main/java/com/renderrichtext/renderer/Renderer.kt +148 -0
  51. package/android/src/main/java/com/renderrichtext/renderer/SoftBreakRenderer.kt +17 -0
  52. package/android/src/main/java/com/renderrichtext/renderer/SpanStyleCache.kt +143 -0
  53. package/android/src/main/java/com/renderrichtext/renderer/StrikethroughRenderer.kt +28 -0
  54. package/android/src/main/java/com/renderrichtext/renderer/StrongRenderer.kt +28 -0
  55. package/android/src/main/java/com/renderrichtext/renderer/TextRenderer.kt +31 -0
  56. package/android/src/main/java/com/renderrichtext/renderer/ThematicBreakRenderer.kt +46 -0
  57. package/android/src/main/java/com/renderrichtext/renderer/UnderlineRenderer.kt +28 -0
  58. package/android/src/main/java/com/renderrichtext/spans/BaseListSpan.kt +164 -0
  59. package/android/src/main/java/com/renderrichtext/spans/BaselineShiftSpan.kt +27 -0
  60. package/android/src/main/java/com/renderrichtext/spans/BlockquoteSpan.kt +302 -0
  61. package/android/src/main/java/com/renderrichtext/spans/CodeBackgroundSpan.kt +205 -0
  62. package/android/src/main/java/com/renderrichtext/spans/CodeBlockSpan.kt +216 -0
  63. package/android/src/main/java/com/renderrichtext/spans/CodeSpan.kt +32 -0
  64. package/android/src/main/java/com/renderrichtext/spans/EmphasisSpan.kt +42 -0
  65. package/android/src/main/java/com/renderrichtext/spans/FactoidBackgroundSpan.kt +265 -0
  66. package/android/src/main/java/com/renderrichtext/spans/FactoidPaddingSpan.kt +258 -0
  67. package/android/src/main/java/com/renderrichtext/spans/FactoidSpan.kt +32 -0
  68. package/android/src/main/java/com/renderrichtext/spans/FadeInSpan.kt +29 -0
  69. package/android/src/main/java/com/renderrichtext/spans/HeadingSpan.kt +38 -0
  70. package/android/src/main/java/com/renderrichtext/spans/HighlightSpan.kt +80 -0
  71. package/android/src/main/java/com/renderrichtext/spans/ImageSpan.kt +481 -0
  72. package/android/src/main/java/com/renderrichtext/spans/InlineBackgroundGeometry.kt +42 -0
  73. package/android/src/main/java/com/renderrichtext/spans/LineHeightSpan.kt +39 -0
  74. package/android/src/main/java/com/renderrichtext/spans/LinkPillIconCache.kt +154 -0
  75. package/android/src/main/java/com/renderrichtext/spans/LinkPillSpan.kt +381 -0
  76. package/android/src/main/java/com/renderrichtext/spans/LinkSpan.kt +68 -0
  77. package/android/src/main/java/com/renderrichtext/spans/ListItemSpacingSpan.kt +33 -0
  78. package/android/src/main/java/com/renderrichtext/spans/ListMarkerAnchorSpan.kt +38 -0
  79. package/android/src/main/java/com/renderrichtext/spans/MarginBottomSpan.kt +76 -0
  80. package/android/src/main/java/com/renderrichtext/spans/MentionChipSpan.kt +132 -0
  81. package/android/src/main/java/com/renderrichtext/spans/MentionSpan.kt +46 -0
  82. package/android/src/main/java/com/renderrichtext/spans/OrderedListSpan.kt +127 -0
  83. package/android/src/main/java/com/renderrichtext/spans/SpoilerSpan.kt +33 -0
  84. package/android/src/main/java/com/renderrichtext/spans/StrikethroughSpan.kt +12 -0
  85. package/android/src/main/java/com/renderrichtext/spans/StrongSpan.kt +39 -0
  86. package/android/src/main/java/com/renderrichtext/spans/TaskListSpan.kt +143 -0
  87. package/android/src/main/java/com/renderrichtext/spans/TextSpan.kt +26 -0
  88. package/android/src/main/java/com/renderrichtext/spans/ThematicBreakSpan.kt +69 -0
  89. package/android/src/main/java/com/renderrichtext/spans/UnorderedListSpan.kt +96 -0
  90. package/android/src/main/java/com/renderrichtext/spoiler/SpoilerStubs.kt +46 -0
  91. package/android/src/main/java/com/renderrichtext/styles/BaseBlockStyle.kt +11 -0
  92. package/android/src/main/java/com/renderrichtext/styles/BlockquoteStyle.kt +83 -0
  93. package/android/src/main/java/com/renderrichtext/styles/CodeBlockStyle.kt +80 -0
  94. package/android/src/main/java/com/renderrichtext/styles/CodeStyle.kt +26 -0
  95. package/android/src/main/java/com/renderrichtext/styles/EmphasisStyle.kt +21 -0
  96. package/android/src/main/java/com/renderrichtext/styles/FactoidStyle.kt +21 -0
  97. package/android/src/main/java/com/renderrichtext/styles/HeadingStyle.kt +33 -0
  98. package/android/src/main/java/com/renderrichtext/styles/HighlightStyle.kt +19 -0
  99. package/android/src/main/java/com/renderrichtext/styles/ImageStyle.kt +29 -0
  100. package/android/src/main/java/com/renderrichtext/styles/InlineImageStyle.kt +17 -0
  101. package/android/src/main/java/com/renderrichtext/styles/InlineMathStyle.kt +17 -0
  102. package/android/src/main/java/com/renderrichtext/styles/LinkPillContent.kt +36 -0
  103. package/android/src/main/java/com/renderrichtext/styles/LinkPillStyle.kt +44 -0
  104. package/android/src/main/java/com/renderrichtext/styles/LinkStyle.kt +23 -0
  105. package/android/src/main/java/com/renderrichtext/styles/LinkVariantEntry.kt +34 -0
  106. package/android/src/main/java/com/renderrichtext/styles/ListStyle.kt +65 -0
  107. package/android/src/main/java/com/renderrichtext/styles/MathStyle.kt +29 -0
  108. package/android/src/main/java/com/renderrichtext/styles/MentionStyle.kt +19 -0
  109. package/android/src/main/java/com/renderrichtext/styles/ParagraphStyle.kt +33 -0
  110. package/android/src/main/java/com/renderrichtext/styles/SpoilerStyle.kt +27 -0
  111. package/android/src/main/java/com/renderrichtext/styles/StrikethroughStyle.kt +17 -0
  112. package/android/src/main/java/com/renderrichtext/styles/StrongStyle.kt +21 -0
  113. package/android/src/main/java/com/renderrichtext/styles/StyleConfig.kt +411 -0
  114. package/android/src/main/java/com/renderrichtext/styles/StyleParser.kt +92 -0
  115. package/android/src/main/java/com/renderrichtext/styles/SubscriptStyle.kt +16 -0
  116. package/android/src/main/java/com/renderrichtext/styles/SuperscriptStyle.kt +16 -0
  117. package/android/src/main/java/com/renderrichtext/styles/TableStyle.kt +75 -0
  118. package/android/src/main/java/com/renderrichtext/styles/TaskListStyle.kt +29 -0
  119. package/android/src/main/java/com/renderrichtext/styles/TextAlignment.kt +32 -0
  120. package/android/src/main/java/com/renderrichtext/styles/ThematicBreakStyle.kt +23 -0
  121. package/android/src/main/java/com/renderrichtext/styles/UnderlineStyle.kt +17 -0
  122. package/android/src/main/java/com/renderrichtext/styles/VideoStyle.kt +31 -0
  123. package/android/src/main/java/com/renderrichtext/utils/common/BorderStyleUtils.kt +86 -0
  124. package/android/src/main/java/com/renderrichtext/utils/common/BreakStrategyUtils.kt +32 -0
  125. package/android/src/main/java/com/renderrichtext/utils/common/CodeBlockHighlighter.kt +36 -0
  126. package/android/src/main/java/com/renderrichtext/utils/common/CodeBlockNode.kt +42 -0
  127. package/android/src/main/java/com/renderrichtext/utils/common/EllipsizeUtils.kt +27 -0
  128. package/android/src/main/java/com/renderrichtext/utils/common/EnrichedTiptapAncestorUtils.kt +10 -0
  129. package/android/src/main/java/com/renderrichtext/utils/common/FeatureFlags.kt +9 -0
  130. package/android/src/main/java/com/renderrichtext/utils/common/LinkRecognitionProps.kt +31 -0
  131. package/android/src/main/java/com/renderrichtext/utils/common/LinkRegexConfig.kt +56 -0
  132. package/android/src/main/java/com/renderrichtext/utils/common/MotionPreferences.kt +18 -0
  133. package/android/src/main/java/com/renderrichtext/utils/common/ReadableMapExtensions.kt +28 -0
  134. package/android/src/main/java/com/renderrichtext/utils/common/TiptapViewManagerUtils.kt +242 -0
  135. package/android/src/main/java/com/renderrichtext/utils/common/layout/RTLUtils.kt +6 -0
  136. package/android/src/main/java/com/renderrichtext/utils/common/serialization/TiptapASTSerializer.kt +368 -0
  137. package/android/src/main/java/com/renderrichtext/utils/text/ImageCache.kt +88 -0
  138. package/android/src/main/java/com/renderrichtext/utils/text/ImageDownloader.kt +203 -0
  139. package/android/src/main/java/com/renderrichtext/utils/text/LocalImageLoader.kt +167 -0
  140. package/android/src/main/java/com/renderrichtext/utils/text/TailFadeInAnimator.kt +84 -0
  141. package/android/src/main/java/com/renderrichtext/utils/text/conversion/HTMLGenerator.kt +1105 -0
  142. package/android/src/main/java/com/renderrichtext/utils/text/conversion/TiptapExtractor.kt +423 -0
  143. package/android/src/main/java/com/renderrichtext/utils/text/extensions/ParagraphUtils.kt +9 -0
  144. package/android/src/main/java/com/renderrichtext/utils/text/extensions/SpannableExtensions.kt +9 -0
  145. package/android/src/main/java/com/renderrichtext/utils/text/extensions/TextPaintExtensions.kt +76 -0
  146. package/android/src/main/java/com/renderrichtext/utils/text/interaction/CheckboxTouchHelper.kt +61 -0
  147. package/android/src/main/java/com/renderrichtext/utils/text/interaction/TaskListTapUtils.kt +286 -0
  148. package/android/src/main/java/com/renderrichtext/utils/text/span/ApplyLineHeight.kt +39 -0
  149. package/android/src/main/java/com/renderrichtext/utils/text/span/BlockSpacing.kt +142 -0
  150. package/android/src/main/java/com/renderrichtext/utils/text/span/SpanFlags.kt +43 -0
  151. package/android/src/main/java/com/renderrichtext/utils/text/span/WidthAwareSpans.kt +30 -0
  152. package/android/src/main/java/com/renderrichtext/utils/text/view/CodeBlockPressHost.kt +15 -0
  153. package/android/src/main/java/com/renderrichtext/utils/text/view/ImagePressHost.kt +19 -0
  154. package/android/src/main/java/com/renderrichtext/utils/text/view/LinkEvents.kt +88 -0
  155. package/android/src/main/java/com/renderrichtext/utils/text/view/LinkLongPressMovementMethod.kt +449 -0
  156. package/android/src/main/java/com/renderrichtext/utils/text/view/SelectionActionMode.kt +235 -0
  157. package/android/src/main/java/com/renderrichtext/utils/text/view/TextSelectionColors.kt +48 -0
  158. package/android/src/main/java/com/renderrichtext/utils/text/view/TextViewSetup.kt +119 -0
  159. package/android/src/main/java/com/renderrichtext/views/ContextMenuPopup.kt +217 -0
  160. package/android/src/main/java/com/renderrichtext/views/CopyGlyph.kt +101 -0
  161. package/android/src/main/java/com/renderrichtext/views/WrapGlyph.kt +40 -0
  162. package/android/src/main/jni/CMakeLists.txt +52 -0
  163. package/android/src/main/jni/react/renderer/components/RichTextSpec/ComponentDescriptors.h +30 -0
  164. package/android/src/main/jni/react/renderer/components/RichTextSpec/TiptapTextComponentDescriptor.h +29 -0
  165. package/android/src/main/jni/react/renderer/components/RichTextSpec/TiptapTextMeasurementManager.cpp +45 -0
  166. package/android/src/main/jni/react/renderer/components/RichTextSpec/TiptapTextMeasurementManager.h +21 -0
  167. package/android/src/main/jni/react/renderer/components/RichTextSpec/TiptapTextShadowNode.cpp +38 -0
  168. package/android/src/main/jni/react/renderer/components/RichTextSpec/TiptapTextShadowNode.h +53 -0
  169. package/android/src/main/jni/react/renderer/components/RichTextSpec/TiptapTextState.cpp +9 -0
  170. package/android/src/main/jni/react/renderer/components/RichTextSpec/TiptapTextState.h +24 -0
  171. package/android/src/main/jni/react/renderer/components/RichTextSpec/conversions.h +40 -0
  172. package/cpp/parser/TiptapASTNode.hpp +68 -0
  173. package/cpp/parser/TiptapParser.cpp +233 -0
  174. package/cpp/parser/TiptapParser.hpp +13 -0
  175. package/cpp/vendor/nlohmann/json.hpp +24765 -0
  176. package/ios/EnrichedTiptapText.h +27 -0
  177. package/ios/EnrichedTiptapText.mm +1222 -0
  178. package/ios/attachments/ENRMImageAttachment.h +51 -0
  179. package/ios/attachments/ENRMImageAttachment.m +398 -0
  180. package/ios/attachments/ENRMLinkPillAttachment.h +47 -0
  181. package/ios/attachments/ENRMLinkPillAttachment.m +324 -0
  182. package/ios/attachments/ENRMLinkPillIconCache.h +28 -0
  183. package/ios/attachments/ENRMLinkPillIconCache.m +181 -0
  184. package/ios/attachments/ENRMLinkPillText.h +27 -0
  185. package/ios/attachments/ENRMLinkPillText.m +118 -0
  186. package/ios/attachments/ENRMMathInlineAttachment.h +7 -0
  187. package/ios/attachments/ENRMMathInlineAttachment.m +4 -0
  188. package/ios/attachments/ThematicBreakAttachment.h +15 -0
  189. package/ios/attachments/ThematicBreakAttachment.m +33 -0
  190. package/ios/internals/ENRMViewFreeMeasurement.h +208 -0
  191. package/ios/internals/EnrichedTiptapTextComponentDescriptor.h +19 -0
  192. package/ios/internals/EnrichedTiptapTextShadowNode.h +43 -0
  193. package/ios/internals/EnrichedTiptapTextShadowNode.mm +69 -0
  194. package/ios/internals/EnrichedTiptapTextState.h +24 -0
  195. package/ios/internals/MeasurementCache.h +308 -0
  196. package/ios/internals/ShadowMeasurementUtils.h +145 -0
  197. package/ios/parser/ENRMTextLinkAttributes.h +7 -0
  198. package/ios/parser/ENRMTiptapParser.h +33 -0
  199. package/ios/parser/ENRMTiptapParser.mm +73 -0
  200. package/ios/parser/TiptapASTNode.h +57 -0
  201. package/ios/parser/TiptapASTNode.m +52 -0
  202. package/ios/parser/TiptapParserBridge.mm +179 -0
  203. package/ios/renderer/AttributedRenderer.h +23 -0
  204. package/ios/renderer/AttributedRenderer.m +229 -0
  205. package/ios/renderer/BaseRenderer.h +33 -0
  206. package/ios/renderer/BaseRenderer.m +46 -0
  207. package/ios/renderer/BaselineShiftTextAttributes.h +10 -0
  208. package/ios/renderer/BaselineShiftTextAttributes.m +26 -0
  209. package/ios/renderer/BlankLineRenderer.h +4 -0
  210. package/ios/renderer/BlankLineRenderer.m +51 -0
  211. package/ios/renderer/BlockquoteRenderer.h +6 -0
  212. package/ios/renderer/BlockquoteRenderer.m +258 -0
  213. package/ios/renderer/CodeBlockRenderer.h +9 -0
  214. package/ios/renderer/CodeBlockRenderer.m +99 -0
  215. package/ios/renderer/CodeRenderer.h +9 -0
  216. package/ios/renderer/CodeRenderer.m +69 -0
  217. package/ios/renderer/ENRMBlockquoteTextRenderer.h +25 -0
  218. package/ios/renderer/ENRMBlockquoteTextRenderer.m +48 -0
  219. package/ios/renderer/EmphasisRenderer.h +5 -0
  220. package/ios/renderer/EmphasisRenderer.m +100 -0
  221. package/ios/renderer/FactoidRenderer.h +9 -0
  222. package/ios/renderer/FactoidRenderer.m +130 -0
  223. package/ios/renderer/HeadingRenderer.h +6 -0
  224. package/ios/renderer/HeadingRenderer.m +103 -0
  225. package/ios/renderer/HighlightRenderer.h +7 -0
  226. package/ios/renderer/HighlightRenderer.m +33 -0
  227. package/ios/renderer/LinkRenderer.h +6 -0
  228. package/ios/renderer/LinkRenderer.m +158 -0
  229. package/ios/renderer/ListItemRenderer.h +24 -0
  230. package/ios/renderer/ListItemRenderer.m +283 -0
  231. package/ios/renderer/ListRenderer.h +13 -0
  232. package/ios/renderer/ListRenderer.m +126 -0
  233. package/ios/renderer/MentionRenderer.h +9 -0
  234. package/ios/renderer/MentionRenderer.m +96 -0
  235. package/ios/renderer/NodeRenderer.h +8 -0
  236. package/ios/renderer/ParagraphRenderer.h +6 -0
  237. package/ios/renderer/ParagraphRenderer.m +85 -0
  238. package/ios/renderer/RenderContext.h +145 -0
  239. package/ios/renderer/RenderContext.m +403 -0
  240. package/ios/renderer/RendererFactory.h +12 -0
  241. package/ios/renderer/RendererFactory.m +158 -0
  242. package/ios/renderer/StrikethroughRenderer.h +5 -0
  243. package/ios/renderer/StrikethroughRenderer.m +30 -0
  244. package/ios/renderer/StrongRenderer.h +5 -0
  245. package/ios/renderer/StrongRenderer.m +88 -0
  246. package/ios/renderer/TextRenderer.h +6 -0
  247. package/ios/renderer/TextRenderer.m +18 -0
  248. package/ios/renderer/ThematicBreakRenderer.h +4 -0
  249. package/ios/renderer/ThematicBreakRenderer.m +42 -0
  250. package/ios/renderer/UnderlineRenderer.h +4 -0
  251. package/ios/renderer/UnderlineRenderer.m +41 -0
  252. package/ios/styles/ENRMFontSlot.h +12 -0
  253. package/ios/styles/ENRMFontSlot.m +24 -0
  254. package/ios/styles/StyleConfig.h +488 -0
  255. package/ios/styles/StyleConfig.mm +2820 -0
  256. package/ios/utils/AccessibilityInfo.h +35 -0
  257. package/ios/utils/AccessibilityInfo.m +24 -0
  258. package/ios/utils/BlockquoteBorder.h +26 -0
  259. package/ios/utils/BlockquoteBorder.m +294 -0
  260. package/ios/utils/CodeBackground.h +19 -0
  261. package/ios/utils/CodeBackground.m +197 -0
  262. package/ios/utils/CodeBlockBackground.h +17 -0
  263. package/ios/utils/CodeBlockBackground.m +103 -0
  264. package/ios/utils/ContextMenuUtils.h +76 -0
  265. package/ios/utils/ContextMenuUtils.mm +75 -0
  266. package/ios/utils/ENRMAccessibilityLabels.h +40 -0
  267. package/ios/utils/ENRMAccessibilityLabels.m +5 -0
  268. package/ios/utils/ENRMAsyncRenderCoordinator.h +24 -0
  269. package/ios/utils/ENRMAsyncRenderCoordinator.m +37 -0
  270. package/ios/utils/ENRMAtomicSize.h +65 -0
  271. package/ios/utils/ENRMCodeBlockContent.h +37 -0
  272. package/ios/utils/ENRMCodeBlockContent.mm +89 -0
  273. package/ios/utils/ENRMFeatureFlags.h +25 -0
  274. package/ios/utils/ENRMImageDownloader.h +30 -0
  275. package/ios/utils/ENRMImageDownloader.m +168 -0
  276. package/ios/utils/ENRMLatexErrorCoordinator.h +27 -0
  277. package/ios/utils/ENRMLatexErrorCoordinator.mm +75 -0
  278. package/ios/utils/ENRMLatexErrorReporting.h +13 -0
  279. package/ios/utils/ENRMLinkContextMenus.h +93 -0
  280. package/ios/utils/ENRMLinkContextMenus.m +178 -0
  281. package/ios/utils/ENRMLinkRegexConfig.h +30 -0
  282. package/ios/utils/ENRMLinkRegexConfig.mm +104 -0
  283. package/ios/utils/ENRMLinkRegexProps.h +23 -0
  284. package/ios/utils/ENRMLocalImageLoader.h +35 -0
  285. package/ios/utils/ENRMLocalImageLoader.m +111 -0
  286. package/ios/utils/ENRMMenuAction.h +27 -0
  287. package/ios/utils/ENRMMenuAction.m +33 -0
  288. package/ios/utils/ENRMSpoilerOverlayManager.h +15 -0
  289. package/ios/utils/ENRMSpoilerOverlayManager.m +19 -0
  290. package/ios/utils/ENRMSpoilerTapUtils.h +6 -0
  291. package/ios/utils/ENRMSpoilerTapUtils.m +11 -0
  292. package/ios/utils/ENRMTailFadeInAnimator.h +16 -0
  293. package/ios/utils/ENRMTailFadeInAnimator.m +161 -0
  294. package/ios/utils/ENRMTextHitTest.h +23 -0
  295. package/ios/utils/ENRMTextHitTest.m +20 -0
  296. package/ios/utils/ENRMTextInteractionUtils.h +20 -0
  297. package/ios/utils/ENRMTextInteractionUtils.m +15 -0
  298. package/ios/utils/ENRMTextRenderer.h +38 -0
  299. package/ios/utils/ENRMTextRenderer.m +54 -0
  300. package/ios/utils/ENRMTextViewSetup.h +132 -0
  301. package/ios/utils/ENRMUIKit.h +429 -0
  302. package/ios/utils/EditMenuUtils.h +105 -0
  303. package/ios/utils/EditMenuUtils.m +143 -0
  304. package/ios/utils/FactoidBackground.h +20 -0
  305. package/ios/utils/FactoidBackground.m +161 -0
  306. package/ios/utils/FontScaleObserver.h +10 -0
  307. package/ios/utils/FontScaleObserver.m +55 -0
  308. package/ios/utils/FontUtils.h +31 -0
  309. package/ios/utils/FontUtils.m +63 -0
  310. package/ios/utils/HTMLGenerator.h +25 -0
  311. package/ios/utils/HTMLGenerator.m +1041 -0
  312. package/ios/utils/HeightUpdateUtils.h +25 -0
  313. package/ios/utils/ImageRequestHeaderUtils.h +35 -0
  314. package/ios/utils/LastElementUtils.h +97 -0
  315. package/ios/utils/LinkContextMenuUtils.h +55 -0
  316. package/ios/utils/LinkPillContentUtils.h +46 -0
  317. package/ios/utils/LinkTapUtils.h +56 -0
  318. package/ios/utils/LinkTapUtils.m +139 -0
  319. package/ios/utils/ListMarkerDrawer.h +15 -0
  320. package/ios/utils/ListMarkerDrawer.m +239 -0
  321. package/ios/utils/MentionBackground.h +26 -0
  322. package/ios/utils/MentionBackground.m +86 -0
  323. package/ios/utils/ParagraphStyleUtils.h +87 -0
  324. package/ios/utils/ParagraphStyleUtils.m +484 -0
  325. package/ios/utils/PasteboardUtils.h +48 -0
  326. package/ios/utils/PasteboardUtils.m +166 -0
  327. package/ios/utils/RTFExportUtils.h +24 -0
  328. package/ios/utils/RTFExportUtils.m +299 -0
  329. package/ios/utils/RuntimeKeys.h +44 -0
  330. package/ios/utils/RuntimeKeys.m +13 -0
  331. package/ios/utils/SelectionColorUtils.h +14 -0
  332. package/ios/utils/StylePropsUtils.h +1340 -0
  333. package/ios/utils/TaskListTapUtils.h +6 -0
  334. package/ios/utils/TaskListTapUtils.m +14 -0
  335. package/ios/utils/TextViewLayoutManager.h +14 -0
  336. package/ios/utils/TextViewLayoutManager.mm +198 -0
  337. package/ios/utils/TiptapAccessibilityElementBuilder.h +43 -0
  338. package/ios/utils/TiptapAccessibilityElementBuilder.m +432 -0
  339. package/ios/utils/TiptapExtractor.h +17 -0
  340. package/ios/utils/TiptapExtractor.m +367 -0
  341. package/ios/views/ENRMTiptapTextView.h +25 -0
  342. package/ios/views/ENRMTiptapTextView.m +247 -0
  343. package/package.json +70 -6
  344. package/react-native.config.js +10 -0
  345. package/src/EnrichedTiptapTextNativeComponent.ts +739 -0
  346. package/src/RichText.tsx +164 -0
  347. package/src/admonitionDefaults.ts +58 -0
  348. package/src/darkModeTextStyle.ts +99 -0
  349. package/src/headingDefaults.ts +21 -0
  350. package/src/index.tsx +4 -0
  351. package/src/linkVariantUtils.ts +120 -0
  352. package/src/normalizeTiptapStyle.ts +397 -0
  353. package/src/rn-globals.d.ts +1 -0
  354. package/src/styleUtils.ts +107 -0
  355. package/src/types/TiptapStyle.ts +532 -0
  356. package/src/types/TiptapStyleInternal.ts +299 -0
  357. package/src/types/linkPill.ts +9 -0
  358. package/src/utils/isDev.ts +4 -0
@@ -0,0 +1,25 @@
1
+ #pragma once
2
+ #import "ENRMUIKit.h"
3
+ #import <React/RCTUtils.h>
4
+ #include <memory>
5
+ #import <react/utils/ManagedObjectWrapper.h>
6
+
7
+ /// Returns YES if the measured content height differs from the frame height
8
+ /// Yoga assigned, comparing at physical-pixel granularity to avoid
9
+ /// false positives from sub-pixel floating-point differences.
10
+ static inline BOOL needsHeightUpdate(CGSize measuredSize, CGRect bounds)
11
+ {
12
+ CGFloat scale = RCTScreenScale();
13
+ CGFloat assignedHeight = ceil(bounds.size.height * scale) / scale;
14
+ CGFloat measuredHeight = ceil(measuredSize.height * scale) / scale;
15
+ return assignedHeight != measuredHeight;
16
+ }
17
+
18
+ template <typename StateDataT, typename ConcreteStateT>
19
+ inline void ENRMRequestHeightUpdate(std::shared_ptr<const ConcreteStateT> const &state, int &counter, id self)
20
+ {
21
+ if (!state)
22
+ return;
23
+ counter++;
24
+ state->updateState(StateDataT(counter, facebook::react::wrapManagedObjectWeakly(self)));
25
+ }
@@ -0,0 +1,35 @@
1
+ #pragma once
2
+
3
+ #import <Foundation/Foundation.h>
4
+
5
+ #ifdef __cplusplus
6
+ #include <vector>
7
+
8
+ template <typename T>
9
+ static bool ENRMImageRequestHeadersChanged(const std::vector<T> &oldHeaders, const std::vector<T> &newHeaders)
10
+ {
11
+ if (newHeaders.size() != oldHeaders.size()) {
12
+ return true;
13
+ }
14
+ for (size_t i = 0; i < newHeaders.size(); i++) {
15
+ if (newHeaders[i].name != oldHeaders[i].name || newHeaders[i].value != oldHeaders[i].value) {
16
+ return true;
17
+ }
18
+ }
19
+ return false;
20
+ }
21
+
22
+ template <typename T>
23
+ static NSDictionary<NSString *, NSString *> *_Nullable ENRMImageRequestHeadersFromProps(const std::vector<T> &headers)
24
+ {
25
+ if (headers.empty()) {
26
+ return nil;
27
+ }
28
+ NSMutableDictionary<NSString *, NSString *> *result = [NSMutableDictionary dictionaryWithCapacity:headers.size()];
29
+ for (const auto &header : headers) {
30
+ result[@(header.name.c_str())] = @(header.value.c_str());
31
+ }
32
+ return [result copy];
33
+ }
34
+
35
+ #endif
@@ -0,0 +1,97 @@
1
+ #pragma once
2
+ #import "ENRMLinkPillAttachment.h"
3
+ #import "ENRMUIKit.h"
4
+
5
+ NS_ASSUME_NONNULL_BEGIN
6
+
7
+ static NSString *const CodeBlockAttributeName = @"CodeBlock";
8
+ static NSString *const CodeBlockIndentAttributeName = @"CodeBlockIndent";
9
+
10
+ /**
11
+ * Returns YES when the last semantic block in the storage is a code block, ignoring any
12
+ * trailing newline spacers (e.g. codeBlockMarginBottom) that may follow it.
13
+ *
14
+ * Detection is based on the last non-newline character: if it sits inside a CodeBlock
15
+ * attribute run, the answer is YES regardless of what newlines come after.
16
+ *
17
+ * Use this in render-time cleanup paths (e.g. removeTrailingSpacing) that need to know
18
+ * "is the document ending with a code block?" before any trailing newlines have been trimmed.
19
+ * The stricter `isLastElementCodeBlock` would answer NO in that pre-trim state because
20
+ * the CodeBlock range hasn't yet been pushed to text.length.
21
+ */
22
+ static inline BOOL isLastBlockACodeBlock(NSAttributedString *text)
23
+ {
24
+ if (text.length == 0)
25
+ return NO;
26
+
27
+ NSRange lastContent = [text.string rangeOfCharacterFromSet:[[NSCharacterSet newlineCharacterSet] invertedSet]
28
+ options:NSBackwardsSearch];
29
+ if (lastContent.location == NSNotFound)
30
+ return NO;
31
+
32
+ NSNumber *isCodeBlock = [text attribute:CodeBlockAttributeName atIndex:lastContent.location effectiveRange:nil];
33
+ return isCodeBlock.boolValue;
34
+ }
35
+
36
+ /**
37
+ * Stricter sibling of `isLastBlockACodeBlock`: requires both that the last non-newline
38
+ * character is inside a CodeBlock run AND that the CodeBlock range extends literally to
39
+ * text.length (i.e. no characters at all live after the code block).
40
+ *
41
+ * Used in the iOS measurement path (and the analogous drawing-compensation check) to
42
+ * decide whether to add `codeBlockPadding` to make up for iOS not measuring/drawing
43
+ * trailing newlines that carry custom minimum/maximum line heights.
44
+ *
45
+ * After `removeTrailingSpacing` runs, the bottom padding spacer is preserved together
46
+ * with a single trailing newline outside the code block range, so this returns NO and
47
+ * the compensation is skipped — the bottom padding spacer is no longer the trailing
48
+ * paragraph terminator, so iOS lays its line fragment out as part of usedRect normally.
49
+ * The check still exists as a safety net for unexpected storage shapes.
50
+ */
51
+ static inline BOOL isLastElementCodeBlock(NSAttributedString *text)
52
+ {
53
+ if (text.length == 0)
54
+ return NO;
55
+
56
+ NSRange lastContent = [text.string rangeOfCharacterFromSet:[[NSCharacterSet newlineCharacterSet] invertedSet]
57
+ options:NSBackwardsSearch];
58
+ if (lastContent.location == NSNotFound)
59
+ return NO;
60
+
61
+ NSNumber *isCodeBlock = [text attribute:CodeBlockAttributeName atIndex:lastContent.location effectiveRange:nil];
62
+ if (!isCodeBlock.boolValue)
63
+ return NO;
64
+
65
+ NSRange codeBlockRange;
66
+ [text attribute:CodeBlockAttributeName atIndex:lastContent.location effectiveRange:&codeBlockRange];
67
+ return NSMaxRange(codeBlockRange) == text.length;
68
+ }
69
+
70
+ /**
71
+ * Checks if the last element in the attributed string is an image attachment.
72
+ * Used to compensate for iOS text attachment baseline spacing issues.
73
+ */
74
+ static inline BOOL isLastElementImage(NSAttributedString *text)
75
+ {
76
+ if (text.length == 0)
77
+ return NO;
78
+
79
+ NSRange lastContent = [text.string rangeOfCharacterFromSet:[[NSCharacterSet newlineCharacterSet] invertedSet]
80
+ options:NSBackwardsSearch];
81
+ if (lastContent.location == NSNotFound)
82
+ return NO;
83
+
84
+ unichar lastChar = [text.string characterAtIndex:lastContent.location];
85
+ if (lastChar != 0xFFFC)
86
+ return NO;
87
+
88
+ id attachment = [text attribute:NSAttachmentAttributeName atIndex:lastContent.location effectiveRange:nil];
89
+ #if !TARGET_OS_OSX
90
+ // A link pill sits on the text baseline like a word; it needs no image compensation.
91
+ if ([attachment isKindOfClass:[ENRMLinkPillAttachment class]])
92
+ return NO;
93
+ #endif
94
+ return attachment != nil;
95
+ }
96
+
97
+ NS_ASSUME_NONNULL_END
@@ -0,0 +1,55 @@
1
+ #pragma once
2
+
3
+ #import "ENRMLinkContextMenus.h"
4
+ #import <Foundation/Foundation.h>
5
+
6
+ #ifdef __cplusplus
7
+ #include <vector>
8
+
9
+ // The `linkContextMenuItems` prop: link long-press menu items by URL pattern.
10
+
11
+ template <typename T>
12
+ static bool ENRMLinkContextMenuItemsChanged(const std::vector<T> &oldMenus, const std::vector<T> &newMenus)
13
+ {
14
+ if (newMenus.size() != oldMenus.size()) {
15
+ return true;
16
+ }
17
+ for (size_t i = 0; i < newMenus.size(); i++) {
18
+ const auto &oldItems = oldMenus[i].items;
19
+ const auto &newItems = newMenus[i].items;
20
+ if (newMenus[i].pattern != oldMenus[i].pattern || newItems.size() != oldItems.size()) {
21
+ return true;
22
+ }
23
+ for (size_t j = 0; j < newItems.size(); j++) {
24
+ if (newItems[j].text != oldItems[j].text || newItems[j].icon != oldItems[j].icon ||
25
+ newItems[j].disabled != oldItems[j].disabled || newItems[j].destructive != oldItems[j].destructive) {
26
+ return true;
27
+ }
28
+ }
29
+ }
30
+ return false;
31
+ }
32
+
33
+ template <typename T>
34
+ static NSArray<ENRMLinkContextMenuEntry *> *_Nonnull ENRMLinkContextMenuEntriesFromProps(const std::vector<T> &menus)
35
+ {
36
+ NSMutableArray<ENRMLinkContextMenuEntry *> *entries = [NSMutableArray arrayWithCapacity:menus.size()];
37
+ for (const auto &menu : menus) {
38
+ NSMutableArray<ENRMLinkContextMenuItem *> *items = [NSMutableArray arrayWithCapacity:menu.items.size()];
39
+ for (const auto &source : menu.items) {
40
+ ENRMLinkContextMenuItem *item = [[ENRMLinkContextMenuItem alloc] init];
41
+ item.text = @(source.text.c_str());
42
+ item.icon = @(source.icon.c_str());
43
+ item.disabled = source.disabled;
44
+ item.destructive = source.destructive;
45
+ [items addObject:item];
46
+ }
47
+ ENRMLinkContextMenuEntry *entry = [[ENRMLinkContextMenuEntry alloc] init];
48
+ entry.pattern = @(menu.pattern.c_str());
49
+ entry.items = items;
50
+ [entries addObject:entry];
51
+ }
52
+ return entries;
53
+ }
54
+
55
+ #endif
@@ -0,0 +1,46 @@
1
+ #pragma once
2
+
3
+ #import "StyleConfig.h"
4
+ #import <Foundation/Foundation.h>
5
+
6
+ #ifdef __cplusplus
7
+ #import <React/RCTConversions.h>
8
+ #include <vector>
9
+
10
+ // The `linkPillContent` prop: per-link pill label and icon, keyed by exact URL.
11
+
12
+ template <typename T>
13
+ static bool ENRMLinkPillContentChanged(const std::vector<T> &oldContent, const std::vector<T> &newContent)
14
+ {
15
+ if (newContent.size() != oldContent.size()) {
16
+ return true;
17
+ }
18
+ for (size_t i = 0; i < newContent.size(); i++) {
19
+ if (newContent[i].url != oldContent[i].url || newContent[i].label != oldContent[i].label ||
20
+ newContent[i].iconUri != oldContent[i].iconUri || newContent[i].iconTintColor != oldContent[i].iconTintColor) {
21
+ return true;
22
+ }
23
+ }
24
+ return false;
25
+ }
26
+
27
+ template <typename T>
28
+ static NSDictionary<NSString *, LinkPillContent *> *_Nullable ENRMLinkPillContentFromProps(
29
+ const std::vector<T> &content)
30
+ {
31
+ if (content.empty()) {
32
+ return nil;
33
+ }
34
+ NSMutableDictionary<NSString *, LinkPillContent *> *result =
35
+ [NSMutableDictionary dictionaryWithCapacity:content.size()];
36
+ for (const auto &entry : content) {
37
+ LinkPillContent *value = [[LinkPillContent alloc] init];
38
+ value.label = @(entry.label.c_str());
39
+ value.iconUri = @(entry.iconUri.c_str());
40
+ value.iconTintColor = entry.iconTintColor ? RCTUIColorFromSharedColor(entry.iconTintColor) : nil;
41
+ result[@(entry.url.c_str())] = value;
42
+ }
43
+ return [result copy];
44
+ }
45
+
46
+ #endif
@@ -0,0 +1,56 @@
1
+ #pragma once
2
+
3
+ #import "ENRMUIKit.h"
4
+
5
+ NS_ASSUME_NONNULL_BEGIN
6
+
7
+ #ifdef __cplusplus
8
+ extern "C" {
9
+ #endif
10
+
11
+ /// Returns the link URL at the tap location, or nil if no link was tapped.
12
+ NSString *_Nullable linkURLAtTapLocation(ENRMPlatformTextView *textView, ENRMTapRecognizer *recognizer);
13
+
14
+ /// Returns the original link URL at a point in text-view coordinates.
15
+ NSString *_Nullable linkURLAtPoint(ENRMPlatformTextView *textView, CGPoint point);
16
+
17
+ /// Returns the link URL at the given character range, or nil if none found.
18
+ NSString *_Nullable linkURLAtRange(ENRMPlatformTextView *textView, NSRange characterRange);
19
+
20
+ /// What the user sees the link at `index` as: its pill label, or its text. Nil when there is no link.
21
+ NSString *_Nullable linkTitleAtIndex(NSAttributedString *text, NSUInteger index);
22
+
23
+ /// Returns the tapped image as @{@"url": ..., @"altText": ...}, or nil if the
24
+ /// tap did not land on an image. A linked image resolves to its link (the
25
+ /// linkURL attribute wins), so this returns nil for it.
26
+ NSDictionary<NSString *, NSString *> *_Nullable imageAtTapLocation(ENRMPlatformTextView *textView,
27
+ ENRMTapRecognizer *recognizer);
28
+
29
+ /// Returns the tapped factoid's id, an empty string when the factoid has no id, or nil
30
+ /// when the tap did not land on a factoid.
31
+ NSString *_Nullable factoidIdAtTapLocation(ENRMPlatformTextView *textView, ENRMTapRecognizer *recognizer);
32
+
33
+ /// Returns @{@"id": ..., @"label": ...} for the mention under the tap, or nil.
34
+ NSDictionary<NSString *, NSString *> *_Nullable mentionAtTapLocation(ENRMPlatformTextView *textView,
35
+ ENRMTapRecognizer *recognizer);
36
+
37
+ /// Returns @{@"id": ..., @"label": ...} for the mention under a point in text-view coordinates, or nil.
38
+ NSDictionary<NSString *, NSString *> *_Nullable mentionAtPoint(ENRMPlatformTextView *textView, CGPoint point);
39
+
40
+ /// Returns the tapped code block as @{@"code": ..., @"language": ...}, or nil if
41
+ /// the tap did not land on a commonmark code block.
42
+ NSDictionary<NSString *, NSString *> *_Nullable codeBlockAtTapLocation(ENRMPlatformTextView *textView,
43
+ ENRMTapRecognizer *recognizer);
44
+
45
+ /// Returns YES if the point (in textView coordinates) is on a link or task list
46
+ /// checkbox. When `includeImages` is YES, images also count as interactive
47
+ /// (used to stop a parent press handler once `onImagePress` is enabled), and
48
+ /// likewise `includeCodeBlock` for `onCodeBlockPress`.
49
+ BOOL isPointOnInteractiveElement(ENRMPlatformTextView *textView, CGPoint point, BOOL includeImages,
50
+ BOOL includeCodeBlock);
51
+
52
+ #ifdef __cplusplus
53
+ }
54
+ #endif
55
+
56
+ NS_ASSUME_NONNULL_END
@@ -0,0 +1,139 @@
1
+ #import "LinkTapUtils.h"
2
+ #import "ENRMLinkPillAttachment.h"
3
+ #import "ENRMSpoilerTapUtils.h"
4
+ #import "ENRMTextHitTest.h"
5
+ #import "FactoidBackground.h"
6
+ #import "MentionBackground.h"
7
+
8
+ NSString *_Nullable linkURLAtTapLocation(ENRMPlatformTextView *textView, ENRMTapRecognizer *recognizer)
9
+ {
10
+ NSUInteger characterIndex = ENRMCharacterIndexForTap(textView, recognizer);
11
+ if (characterIndex == NSNotFound)
12
+ return nil;
13
+
14
+ NSAttributedString *attrText = ENRMGetAttributedText(textView);
15
+ return [attrText attribute:@"linkURL" atIndex:characterIndex effectiveRange:NULL];
16
+ }
17
+
18
+ NSString *_Nullable linkURLAtPoint(ENRMPlatformTextView *textView, CGPoint point)
19
+ {
20
+ NSUInteger index = ENRMCharacterIndexAtPoint(textView, point);
21
+ if (index == NSNotFound)
22
+ return nil;
23
+ return [ENRMGetAttributedText(textView) attribute:@"linkURL" atIndex:index effectiveRange:NULL];
24
+ }
25
+
26
+ NSString *_Nullable linkURLAtRange(ENRMPlatformTextView *textView, NSRange characterRange)
27
+ {
28
+ NSAttributedString *attrText = ENRMGetAttributedText(textView);
29
+ if (characterRange.location >= attrText.length) {
30
+ return nil;
31
+ }
32
+ return [attrText attribute:@"linkURL" atIndex:characterRange.location effectiveRange:NULL];
33
+ }
34
+
35
+ NSString *_Nullable linkTitleAtIndex(NSAttributedString *text, NSUInteger index)
36
+ {
37
+ if (index >= text.length)
38
+ return nil;
39
+ #if !TARGET_OS_OSX
40
+ id attachment = [text attribute:NSAttachmentAttributeName atIndex:index effectiveRange:NULL];
41
+ if ([attachment isKindOfClass:ENRMLinkPillAttachment.class])
42
+ return ((ENRMLinkPillAttachment *)attachment).label;
43
+ #endif
44
+ NSRange range;
45
+ id url = [text attribute:@"linkURL" atIndex:index longestEffectiveRange:&range inRange:NSMakeRange(0, text.length)];
46
+ return url ? [text.string substringWithRange:range] : nil;
47
+ }
48
+
49
+ NSDictionary<NSString *, NSString *> *_Nullable imageAtTapLocation(ENRMPlatformTextView *textView,
50
+ ENRMTapRecognizer *recognizer)
51
+ {
52
+ NSUInteger characterIndex = ENRMCharacterIndexForTap(textView, recognizer);
53
+ if (characterIndex == NSNotFound)
54
+ return nil;
55
+
56
+ NSAttributedString *attrText = ENRMGetAttributedText(textView);
57
+ if ([attrText attribute:@"linkURL" atIndex:characterIndex effectiveRange:NULL] != nil)
58
+ return nil;
59
+
60
+ NSString *url = [attrText attribute:@"imageURL" atIndex:characterIndex effectiveRange:NULL];
61
+ if (!url)
62
+ return nil;
63
+
64
+ NSString *altText = [attrText attribute:@"imageAltText" atIndex:characterIndex effectiveRange:NULL];
65
+ return @{@"url" : url, @"altText" : altText ?: @""};
66
+ }
67
+
68
+ static NSDictionary<NSString *, NSString *> *_Nullable mentionAtIndex(NSAttributedString *attrText, NSUInteger characterIndex)
69
+ {
70
+ if (characterIndex == NSNotFound || characterIndex >= attrText.length)
71
+ return nil;
72
+ if ([attrText attribute:MentionAttributeName atIndex:characterIndex effectiveRange:NULL] == nil)
73
+ return nil;
74
+
75
+ NSString *mentionId = [attrText attribute:MentionIdAttributeName atIndex:characterIndex effectiveRange:NULL] ?: @"";
76
+ NSString *label = [attrText attribute:MentionLabelAttributeName atIndex:characterIndex effectiveRange:NULL] ?: @"";
77
+ return @{@"id" : mentionId, @"label" : label};
78
+ }
79
+
80
+ NSDictionary<NSString *, NSString *> *_Nullable mentionAtTapLocation(ENRMPlatformTextView *textView,
81
+ ENRMTapRecognizer *recognizer)
82
+ {
83
+ return mentionAtIndex(ENRMGetAttributedText(textView), ENRMCharacterIndexForTap(textView, recognizer));
84
+ }
85
+
86
+ NSDictionary<NSString *, NSString *> *_Nullable mentionAtPoint(ENRMPlatformTextView *textView, CGPoint point)
87
+ {
88
+ return mentionAtIndex(ENRMGetAttributedText(textView), ENRMCharacterIndexAtPoint(textView, point));
89
+ }
90
+
91
+ NSString *_Nullable factoidIdAtTapLocation(ENRMPlatformTextView *textView, ENRMTapRecognizer *recognizer)
92
+ {
93
+ NSUInteger characterIndex = ENRMCharacterIndexForTap(textView, recognizer);
94
+ if (characterIndex == NSNotFound)
95
+ return nil;
96
+
97
+ NSAttributedString *attrText = ENRMGetAttributedText(textView);
98
+ if (characterIndex >= attrText.length)
99
+ return nil;
100
+ if ([attrText attribute:FactoidAttributeName atIndex:characterIndex effectiveRange:NULL] == nil)
101
+ return nil;
102
+
103
+ NSString *factoidId = [attrText attribute:FactoidIdAttributeName atIndex:characterIndex effectiveRange:NULL];
104
+ return factoidId ?: @"";
105
+ }
106
+
107
+ NSDictionary<NSString *, NSString *> *_Nullable codeBlockAtTapLocation(ENRMPlatformTextView *textView,
108
+ ENRMTapRecognizer *recognizer)
109
+ {
110
+ NSUInteger characterIndex = ENRMCharacterIndexForTap(textView, recognizer);
111
+ if (characterIndex == NSNotFound)
112
+ return nil;
113
+
114
+ NSAttributedString *attrText = ENRMGetAttributedText(textView);
115
+ NSString *code = [attrText attribute:@"codeBlockText" atIndex:characterIndex effectiveRange:NULL];
116
+ if (!code)
117
+ return nil;
118
+
119
+ NSString *language = [attrText attribute:@"codeBlockLanguage" atIndex:characterIndex effectiveRange:NULL];
120
+ return @{@"code" : code, @"language" : language ?: @""};
121
+ }
122
+
123
+ BOOL isPointOnInteractiveElement(ENRMPlatformTextView *textView, CGPoint point, BOOL includeImages,
124
+ BOOL includeCodeBlock)
125
+ {
126
+ NSUInteger charIndex = ENRMCharacterIndexAtPoint(textView, point);
127
+ if (charIndex == NSNotFound)
128
+ return NO;
129
+
130
+ NSDictionary *attrs = [ENRMGetAttributedText(textView) attributesAtIndex:charIndex effectiveRange:NULL];
131
+ if (attrs[@"linkURL"] != nil || [attrs[@"TaskItem"] boolValue] || attrs[SpoilerAttributeName] != nil ||
132
+ attrs[FactoidAttributeName] != nil || attrs[MentionAttributeName] != nil)
133
+ return YES;
134
+
135
+ if (includeImages && attrs[@"imageURL"] != nil)
136
+ return YES;
137
+
138
+ return includeCodeBlock && attrs[@"codeBlockText"] != nil;
139
+ }
@@ -0,0 +1,15 @@
1
+ #import "ENRMUIKit.h"
2
+ #import <Foundation/Foundation.h>
3
+
4
+ @class StyleConfig;
5
+
6
+ @interface ListMarkerDrawer : NSObject
7
+
8
+ - (instancetype)initWithConfig:(StyleConfig *)config;
9
+
10
+ - (void)drawMarkersForGlyphRange:(NSRange)glyphsToShow
11
+ layoutManager:(NSLayoutManager *)layoutManager
12
+ textContainer:(NSTextContainer *)textContainer
13
+ atPoint:(CGPoint)origin;
14
+
15
+ @end