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

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,130 @@
1
+ #import "FactoidRenderer.h"
2
+ #import "FactoidBackground.h"
3
+ #import "TiptapASTNode.h"
4
+ #import "RenderContext.h"
5
+ #import "RendererFactory.h"
6
+ #import "StyleConfig.h"
7
+
8
+ static RCTUIColor *ENRMColorFromString(NSString *value)
9
+ {
10
+ if (value.length == 0)
11
+ return nil;
12
+
13
+ NSString *trimmed = [value stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceAndNewlineCharacterSet]];
14
+ if (trimmed.length == 0)
15
+ return nil;
16
+
17
+ if ([trimmed characterAtIndex:0] == '#') {
18
+ NSString *hex = [trimmed substringFromIndex:1];
19
+ if (hex.length != 6 && hex.length != 8)
20
+ return nil;
21
+ unsigned int rgba = 0;
22
+ NSScanner *scanner = [NSScanner scannerWithString:hex];
23
+ if (![scanner scanHexInt:&rgba] || !scanner.isAtEnd)
24
+ return nil;
25
+ CGFloat alpha = 1.0;
26
+ CGFloat red;
27
+ CGFloat green;
28
+ CGFloat blue;
29
+ if (hex.length == 8) {
30
+ alpha = ((rgba >> 24) & 0xFF) / 255.0;
31
+ red = ((rgba >> 16) & 0xFF) / 255.0;
32
+ green = ((rgba >> 8) & 0xFF) / 255.0;
33
+ blue = (rgba & 0xFF) / 255.0;
34
+ } else {
35
+ red = ((rgba >> 16) & 0xFF) / 255.0;
36
+ green = ((rgba >> 8) & 0xFF) / 255.0;
37
+ blue = (rgba & 0xFF) / 255.0;
38
+ }
39
+ return [RCTUIColor colorWithRed:red green:green blue:blue alpha:alpha];
40
+ }
41
+
42
+ static NSDictionary<NSString *, RCTUIColor *> *namedColors;
43
+ static dispatch_once_t onceToken;
44
+ dispatch_once(&onceToken, ^{
45
+ namedColors = @{
46
+ @"black" : [RCTUIColor blackColor],
47
+ @"darkgray" : [RCTUIColor darkGrayColor],
48
+ @"darkgrey" : [RCTUIColor darkGrayColor],
49
+ @"gray" : [RCTUIColor grayColor],
50
+ @"grey" : [RCTUIColor grayColor],
51
+ @"lightgray" : [RCTUIColor lightGrayColor],
52
+ @"lightgrey" : [RCTUIColor lightGrayColor],
53
+ @"white" : [RCTUIColor whiteColor],
54
+ @"red" : [RCTUIColor redColor],
55
+ @"green" : [RCTUIColor greenColor],
56
+ @"blue" : [RCTUIColor blueColor],
57
+ @"yellow" : [RCTUIColor yellowColor],
58
+ @"cyan" : [RCTUIColor cyanColor],
59
+ @"aqua" : [RCTUIColor cyanColor],
60
+ @"magenta" : [RCTUIColor magentaColor],
61
+ @"fuchsia" : [RCTUIColor magentaColor],
62
+ @"lime" : [RCTUIColor colorWithRed:0 green:1 blue:0 alpha:1],
63
+ @"maroon" : [RCTUIColor colorWithRed:0.5 green:0 blue:0 alpha:1],
64
+ @"navy" : [RCTUIColor colorWithRed:0 green:0 blue:0.5 alpha:1],
65
+ @"olive" : [RCTUIColor colorWithRed:0.5 green:0.5 blue:0 alpha:1],
66
+ @"purple" : [RCTUIColor colorWithRed:0.5 green:0 blue:0.5 alpha:1],
67
+ @"silver" : [RCTUIColor colorWithRed:0.75 green:0.75 blue:0.75 alpha:1],
68
+ @"teal" : [RCTUIColor colorWithRed:0 green:0.5 blue:0.5 alpha:1],
69
+ };
70
+ });
71
+ return namedColors[trimmed.lowercaseString];
72
+ }
73
+
74
+ static RCTUIColor *ENRMFactoidColor(NSString *value, RCTUIColor *styleColor, unsigned int rgb)
75
+ {
76
+ RCTUIColor *parsed = ENRMColorFromString(value);
77
+ if (parsed)
78
+ return parsed;
79
+ if (styleColor)
80
+ return styleColor;
81
+ return [RCTUIColor colorWithRed:((rgb >> 16) & 0xFF) / 255.0
82
+ green:((rgb >> 8) & 0xFF) / 255.0
83
+ blue:(rgb & 0xFF) / 255.0
84
+ alpha:1.0];
85
+ }
86
+
87
+ @implementation FactoidRenderer
88
+
89
+ - (id)takeContextSnapshot:(RenderContext *)context
90
+ {
91
+ return [context snapshotScope];
92
+ }
93
+
94
+ - (void)renderNodeContent:(TiptapASTNode *)node
95
+ into:(NSMutableAttributedString *)output
96
+ context:(RenderContext *)context
97
+ {
98
+ NSString *factoidId = node.attributes[@"id"] ?: @"";
99
+ // A node attribute replaces the matching textStyle.factoid color. The RGB values are the
100
+ // same defaults JS applies when textStyle.factoid omits a color.
101
+ RCTUIColor *textColor = ENRMFactoidColor(node.attributes[@"color"], _config.factoidColor, 0x205710);
102
+ RCTUIColor *backgroundColor =
103
+ ENRMFactoidColor(node.attributes[@"backgroundColor"], _config.factoidBackgroundColor, 0x9BFC6E);
104
+ RCTUIColor *borderColor =
105
+ ENRMFactoidColor(node.attributes[@"borderColor"], _config.factoidBorderColor, 0x23670D);
106
+
107
+ // Inline children keep the surrounding font. The text color becomes their base color.
108
+ BlockStyle *block = [context getBlockStyle];
109
+ UIFont *font = block.cachedFont;
110
+ if (!font) {
111
+ font = [context cachedFontForSize:block.fontSize family:block.fontFamily weight:block.fontWeight];
112
+ }
113
+ [context setBlockStyle:context.currentBlockType
114
+ font:font
115
+ color:textColor
116
+ headingLevel:context.currentHeadingLevel];
117
+
118
+ NSUInteger start = output.length;
119
+ [_rendererFactory renderChildrenOfNode:node into:output context:context];
120
+ NSRange range = NSMakeRange(start, output.length > start ? output.length - start : 0);
121
+ if (range.length == 0)
122
+ return;
123
+
124
+ [output addAttribute:FactoidAttributeName value:@YES range:range];
125
+ [output addAttribute:FactoidIdAttributeName value:factoidId range:range];
126
+ [output addAttribute:FactoidBackgroundColorAttributeName value:backgroundColor range:range];
127
+ [output addAttribute:FactoidBorderColorAttributeName value:borderColor range:range];
128
+ }
129
+
130
+ @end
@@ -0,0 +1,6 @@
1
+ #import "BaseRenderer.h"
2
+ #import "TiptapASTNode.h"
3
+ #import "RenderContext.h"
4
+
5
+ @interface HeadingRenderer : BaseRenderer
6
+ @end
@@ -0,0 +1,103 @@
1
+ #import "HeadingRenderer.h"
2
+ #import "ENRMLinkPillText.h"
3
+ #import "FontUtils.h"
4
+ #import "ParagraphStyleUtils.h"
5
+ #import "RenderContext.h"
6
+ #import "RendererFactory.h"
7
+ #import "RuntimeKeys.h"
8
+ #import "StyleConfig.h"
9
+
10
+ // Lightweight struct to hold style data without object overhead
11
+ typedef struct {
12
+ __unsafe_unretained UIFont *font;
13
+ __unsafe_unretained RCTUIColor *color;
14
+ CGFloat marginTop;
15
+ CGFloat marginBottom;
16
+ CGFloat lineHeight;
17
+ NSTextAlignment textAlign;
18
+ } HeadingStyle;
19
+
20
+ static NSString *const kHeadingTypes[] = {nil, @"heading-1", @"heading-2", @"heading-3",
21
+ @"heading-4", @"heading-5", @"heading-6"};
22
+
23
+ @implementation HeadingRenderer
24
+
25
+ - (id)takeContextSnapshot:(RenderContext *)context
26
+ {
27
+ return [context snapshotScope];
28
+ }
29
+
30
+ - (void)renderNodeContent:(TiptapASTNode *)node
31
+ into:(NSMutableAttributedString *)output
32
+ context:(RenderContext *)context
33
+ {
34
+ if (output.length > 0 && ![output.string hasSuffix:@"\n"]) {
35
+ [output appendAttributedString:kNewlineAttributedString];
36
+ }
37
+
38
+ NSInteger level = [node.attributes[@"level"] integerValue];
39
+ if (level < 1 || level > 6)
40
+ level = 1;
41
+
42
+ HeadingStyle style = [self styleForLevel:level];
43
+ [context setBlockStyle:BlockTypeHeading font:style.font color:style.color headingLevel:level];
44
+
45
+ NSUInteger start = output.length;
46
+ NSUInteger contentStart = start;
47
+
48
+ // Spacing at the very start of the document requires a spacer character (index 0 check)
49
+ if (start == 0) {
50
+ NSUInteger offset = applyBlockSpacingBefore(output, 0, style.marginTop);
51
+ contentStart += offset;
52
+ start += offset;
53
+ }
54
+
55
+ [_rendererFactory renderChildrenOfNode:node into:output context:context];
56
+
57
+ NSRange range = NSMakeRange(start, output.length - start);
58
+ if (range.length == 0)
59
+ return;
60
+
61
+ // Register heading for accessibility
62
+ NSString *headingText = ENRMStringByExpandingLinkPills([output attributedSubstringFromRange:range]);
63
+ [context registerHeadingRange:range level:level text:headingText];
64
+
65
+ // Metadata attribute used for post-processing (e.g., Export to Tiptap/HTML)
66
+ [output addAttribute:TiptapTypeAttributeName value:kHeadingTypes[level] range:range];
67
+
68
+ applyLineHeight(output, range, style.lineHeight);
69
+ applyBaselineOffset(output, range);
70
+ applyTextAlignment(output, range, style.textAlign);
71
+
72
+ // Skip marginTop for the first block — already handled by applyBlockSpacingBefore above
73
+ if (contentStart != 1) {
74
+ NSUInteger inserted = applyParagraphSpacingBefore(output, range, style.marginTop);
75
+ start += inserted;
76
+ }
77
+ applyParagraphSpacingAfter(output, start, style.marginBottom);
78
+ }
79
+
80
+ #pragma mark - Style Mapping
81
+
82
+ - (HeadingStyle)styleForLevel:(NSInteger)level
83
+ {
84
+ StyleConfig *c = _config;
85
+ switch (level) {
86
+ case 1:
87
+ return (HeadingStyle){c.h1Font, c.h1Color, c.h1MarginTop, c.h1MarginBottom, c.h1LineHeight, c.h1TextAlign};
88
+ case 2:
89
+ return (HeadingStyle){c.h2Font, c.h2Color, c.h2MarginTop, c.h2MarginBottom, c.h2LineHeight, c.h2TextAlign};
90
+ case 3:
91
+ return (HeadingStyle){c.h3Font, c.h3Color, c.h3MarginTop, c.h3MarginBottom, c.h3LineHeight, c.h3TextAlign};
92
+ case 4:
93
+ return (HeadingStyle){c.h4Font, c.h4Color, c.h4MarginTop, c.h4MarginBottom, c.h4LineHeight, c.h4TextAlign};
94
+ case 5:
95
+ return (HeadingStyle){c.h5Font, c.h5Color, c.h5MarginTop, c.h5MarginBottom, c.h5LineHeight, c.h5TextAlign};
96
+ case 6:
97
+ return (HeadingStyle){c.h6Font, c.h6Color, c.h6MarginTop, c.h6MarginBottom, c.h6LineHeight, c.h6TextAlign};
98
+ default:
99
+ return [self styleForLevel:1];
100
+ }
101
+ }
102
+
103
+ @end
@@ -0,0 +1,7 @@
1
+ #pragma once
2
+ #import "BaseRenderer.h"
3
+
4
+ extern NSString *const HighlightAttributeName;
5
+
6
+ @interface HighlightRenderer : BaseRenderer
7
+ @end
@@ -0,0 +1,33 @@
1
+ #import "HighlightRenderer.h"
2
+ #import "TiptapASTNode.h"
3
+ #import "RenderContext.h"
4
+ #import "RendererFactory.h"
5
+ #import "StyleConfig.h"
6
+
7
+ NSString *const HighlightAttributeName = @"EnrichedTiptapHighlight";
8
+
9
+ @implementation HighlightRenderer
10
+
11
+ #pragma mark - Rendering
12
+
13
+ - (void)renderNodeContent:(TiptapASTNode *)node
14
+ into:(NSMutableAttributedString *)output
15
+ context:(RenderContext *)context
16
+ {
17
+ NSUInteger start = output.length;
18
+ [_rendererFactory renderChildrenOfNode:node into:output context:context];
19
+
20
+ NSRange range = NSMakeRange(start, output.length - start);
21
+ if (range.length == 0)
22
+ return;
23
+
24
+ BlockStyle *blockStyle = [context getBlockStyle];
25
+ RCTUIColor *foregroundColor = [RenderContext calculateHighlightColor:[_config highlightColor]
26
+ paragraphColor:[_config paragraphColor]
27
+ blockColor:blockStyle.color];
28
+ [output addAttribute:NSForegroundColorAttributeName value:foregroundColor range:range];
29
+ [output addAttribute:NSBackgroundColorAttributeName value:[_config highlightBackgroundColor] range:range];
30
+ [output addAttribute:HighlightAttributeName value:@YES range:range];
31
+ }
32
+
33
+ @end
@@ -0,0 +1,6 @@
1
+ #import "BaseRenderer.h"
2
+ #import "TiptapASTNode.h"
3
+ #import "RenderContext.h"
4
+
5
+ @interface LinkRenderer : BaseRenderer
6
+ @end
@@ -0,0 +1,158 @@
1
+ #import "LinkRenderer.h"
2
+ #import "CodeBackground.h"
3
+ #import "ENRMLinkPillAttachment.h"
4
+ #import "ENRMSpoilerTapUtils.h"
5
+ #import "ENRMTextLinkAttributes.h"
6
+ #import "FontUtils.h"
7
+ #import "RenderContext.h"
8
+ #import "RendererFactory.h"
9
+ #import "StyleConfig.h"
10
+ #import <React/RCTFont.h>
11
+
12
+ #if !TARGET_OS_OSX
13
+ static BOOL ENRMRangeHasAttribute(NSAttributedString *text, NSRange range, NSAttributedStringKey key)
14
+ {
15
+ __block BOOL found = NO;
16
+ [text enumerateAttribute:key
17
+ inRange:range
18
+ options:0
19
+ usingBlock:^(id value, NSRange subrange, BOOL *stop) {
20
+ if (value) {
21
+ found = YES;
22
+ *stop = YES;
23
+ }
24
+ }];
25
+ return found;
26
+ }
27
+
28
+ /// Replaces the rendered link content with one attachment character and returns its range.
29
+ static NSRange ENRMCollapseLinkIntoPill(NSMutableAttributedString *output, NSRange range, NSString *url,
30
+ LinkVariantConfig *variant, StyleConfig *config, RenderContext *context)
31
+ {
32
+ LinkPillContent *content = [config linkPillContent][url];
33
+ BOOL hasOwnIcon = content.iconUri.length > 0;
34
+ // A tint set for the link wins. The variant's tint is for the variant's own icon, not for an
35
+ // icon supplied per link (an avatar would become a silhouette).
36
+ RCTUIColor *iconTint = content.iconTintColor ?: (hasOwnIcon ? nil : variant.pill.iconTintColor);
37
+ NSDictionary<NSAttributedStringKey, id> *attributes = [output attributesAtIndex:range.location effectiveRange:NULL];
38
+ ENRMLinkPillAttachment *pill = [[ENRMLinkPillAttachment alloc]
39
+ initWithOriginalText:[output attributedSubstringFromRange:range]
40
+ variant:variant
41
+ label:content.label.length > 0 ? content.label : variant.pill.label
42
+ iconUri:hasOwnIcon ? content.iconUri : variant.pill.iconUri
43
+ iconTintColor:iconTint
44
+ font:attributes[NSFontAttributeName] ?: [context getBlockStyle].cachedFont
45
+ requestHeaders:[config imageRequestHeaders]];
46
+ pill.lineHeight = [config lineHeightForLinkPill:variant.pill];
47
+
48
+ // The placeholder keeps the block context of the text it replaces. The pill draws its own
49
+ // background, underline and label, so inline decoration of that text must not show around it.
50
+ NSMutableDictionary<NSAttributedStringKey, id> *placeholder = [attributes mutableCopy];
51
+ [placeholder removeObjectsForKeys:@[
52
+ NSBackgroundColorAttributeName, NSUnderlineStyleAttributeName, NSUnderlineColorAttributeName,
53
+ NSStrikethroughStyleAttributeName, CodeAttributeName
54
+ ]];
55
+ placeholder[NSAttachmentAttributeName] = pill;
56
+ [output replaceCharactersInRange:range
57
+ withAttributedString:[[NSAttributedString alloc] initWithString:@"\uFFFC" attributes:placeholder]];
58
+ return NSMakeRange(range.location, 1);
59
+ }
60
+ #endif
61
+
62
+ @implementation LinkRenderer
63
+
64
+ #pragma mark - Rendering
65
+
66
+ - (void)renderNodeContent:(TiptapASTNode *)node
67
+ into:(NSMutableAttributedString *)output
68
+ context:(RenderContext *)context
69
+ {
70
+ BOOL recognizedLink = [node.attributes[@"recognizedLink"] isEqualToString:@"true"];
71
+ NSUInteger start = output.length;
72
+
73
+ // 1. Render children first to establish base attributes
74
+ [_rendererFactory renderChildrenOfNode:node into:output context:context];
75
+
76
+ NSRange range = NSMakeRange(start, output.length - start);
77
+ if (range.length == 0)
78
+ return;
79
+
80
+ // 2. Extract configuration
81
+ NSString *url = node.attributes[@"url"] ?: @"";
82
+ LinkVariantConfig *variant = [_config effectiveLinkVariantForURL:url];
83
+
84
+ RCTUIColor *linkColor = variant.color ?: [_config linkColor];
85
+ BOOL linkUnderline = variant ? variant.underline : [_config linkUnderline];
86
+ NSString *linkFontFamily = variant.fontFamily.length > 0 ? variant.fontFamily : [_config linkFontFamily];
87
+ RCTUIColor *backgroundColor = variant ? variant.backgroundColor : [_config linkBackgroundColor];
88
+
89
+ NSNumber *underlineStyle = @(linkUnderline ? NSUnderlineStyleSingle : NSUnderlineStyleNone);
90
+
91
+ // 3. Apply core link functionality (non-destructive)
92
+ [output addAttribute:NSLinkAttributeName value:url range:range];
93
+
94
+ // 4. Optimize visual attributes via enumeration to avoid redundant updates
95
+ [output enumerateAttributesInRange:range
96
+ options:NSAttributedStringEnumerationLongestEffectiveRangeNotRequired
97
+ usingBlock:^(NSDictionary<NSAttributedStringKey, id> *attrs, NSRange subrange, BOOL *stop) {
98
+ NSMutableDictionary *newAttributes = [NSMutableDictionary dictionary];
99
+ if (recognizedLink) {
100
+ newAttributes[ENRMRecognizedLinkAttributeName] = @YES;
101
+ newAttributes[ENRMRecognizedLinkOriginalUnderlineAttributeName] =
102
+ attrs[NSUnderlineStyleAttributeName] ?: @0;
103
+ }
104
+
105
+ // Only apply link color if the subrange isn't already colored by the link style
106
+ if (linkColor && ![attrs[NSForegroundColorAttributeName] isEqual:linkColor]) {
107
+ newAttributes[NSForegroundColorAttributeName] = linkColor;
108
+ newAttributes[NSUnderlineColorAttributeName] = linkColor;
109
+ }
110
+
111
+ // Only update underline style if it differs from the config
112
+ if (![attrs[NSUnderlineStyleAttributeName] isEqual:underlineStyle]) {
113
+ newAttributes[NSUnderlineStyleAttributeName] = underlineStyle;
114
+ }
115
+
116
+ if (linkFontFamily.length > 0) {
117
+ UIFont *currentFont = attrs[NSFontAttributeName];
118
+ if (currentFont) {
119
+ UIFont *linkFont = [RCTFont updateFont:currentFont
120
+ withFamily:linkFontFamily
121
+ size:nil
122
+ weight:nil
123
+ style:nil
124
+ variant:nil
125
+ scaleMultiplier:1.0];
126
+ if (linkFont && ![currentFont isEqual:linkFont]) {
127
+ newAttributes[NSFontAttributeName] = linkFont;
128
+ }
129
+ }
130
+ }
131
+
132
+ if (newAttributes.count > 0) {
133
+ [output addAttributes:newAttributes range:subrange];
134
+ }
135
+ }];
136
+
137
+ #if !TARGET_OS_OSX
138
+ // A pill is one line and one unit: links holding attachments or a line break stay ordinary links.
139
+ // So do links holding a spoiler, whose hidden text the label would show.
140
+ BOOL willBePill =
141
+ variant.pill != nil && !ENRMRangeHasAttribute(output, range, NSAttachmentAttributeName) &&
142
+ !ENRMRangeHasAttribute(output, range, SpoilerAttributeName) &&
143
+ [output.string rangeOfCharacterFromSet:NSCharacterSet.newlineCharacterSet options:0 range:range].location ==
144
+ NSNotFound;
145
+ #else
146
+ BOOL willBePill = NO;
147
+ #endif
148
+ if (backgroundColor && !willBePill)
149
+ [output addAttribute:NSBackgroundColorAttributeName value:backgroundColor range:range];
150
+
151
+ #if !TARGET_OS_OSX
152
+ if (willBePill)
153
+ range = ENRMCollapseLinkIntoPill(output, range, url, variant, _config, context);
154
+ #endif
155
+ [context registerLinkRange:range url:url];
156
+ }
157
+
158
+ @end
@@ -0,0 +1,24 @@
1
+ #import "BaseRenderer.h"
2
+ #import "RenderContext.h"
3
+
4
+ extern NSString *const ListDepthAttribute;
5
+ extern NSString *const ListTypeAttribute;
6
+ extern NSString *const ListItemNumberAttribute;
7
+ extern NSString *const ListItemMarkerStartAttribute;
8
+
9
+ extern NSString *const TaskItemAttribute;
10
+ extern NSString *const TaskCheckedAttribute;
11
+ extern NSString *const TaskIndexAttribute;
12
+
13
+ @interface ENRMListMarkerDescriptor : NSObject
14
+ @property (nonatomic, assign) BOOL isTask;
15
+ @property (nonatomic, assign) BOOL isChecked;
16
+ @property (nonatomic, assign) NSInteger taskIndex;
17
+ @property (nonatomic, assign) ListType listType;
18
+ @property (nonatomic, assign) NSInteger number;
19
+ @property (nonatomic, assign) NSInteger depth;
20
+ @property (nonatomic, assign) CGFloat indent;
21
+ @end
22
+
23
+ @interface ListItemRenderer : BaseRenderer
24
+ @end