@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,143 @@
1
+ #import "EditMenuUtils.h"
2
+ #import "PasteboardUtils.h"
3
+ #import "StyleConfig.h"
4
+ #include <TargetConditionals.h>
5
+
6
+ #if !TARGET_OS_OSX
7
+
8
+ static NSString *const kMenuIdentifierStandardEdit = @"com.apple.menu.standard-edit";
9
+ static NSString *const kActionIdentifierCopy = @"com.swmansion.enriched.tiptap.copy";
10
+ static NSString *const kActionIdentifierCopyTiptap = @"com.swmansion.enriched.tiptap.copyTiptap";
11
+ static NSString *const kActionIdentifierCopyImageURL = @"com.swmansion.enriched.tiptap.copyImageURL";
12
+
13
+ static UIAction *createCopyAction(NSAttributedString *selectedText, NSString *tiptap, StyleConfig *styleConfig,
14
+ NSString *copyLabel)
15
+ {
16
+ return [UIAction actionWithTitle:copyLabel
17
+ image:[RCTUIImage systemImageNamed:@"doc.on.doc"]
18
+ identifier:kActionIdentifierCopy
19
+ handler:^(__kindof UIAction *action) {
20
+ copyAttributedStringToPasteboard(selectedText, tiptap, styleConfig);
21
+ }];
22
+ }
23
+
24
+ static UIAction *_Nullable createCopyTiptapAction(NSString *tiptap, NSString *copyAsTiptapLabel)
25
+ {
26
+ if (tiptap.length == 0)
27
+ return nil;
28
+
29
+ return [UIAction actionWithTitle:copyAsTiptapLabel
30
+ image:[RCTUIImage systemImageNamed:@"doc.text"]
31
+ identifier:kActionIdentifierCopyTiptap
32
+ handler:^(__kindof UIAction *action) { copyStringToPasteboard(tiptap); }];
33
+ }
34
+
35
+ static UIAction *_Nullable createCopyImageURLAction(NSArray<NSString *> *imageURLs,
36
+ ENRMSelectionMenuConfig selectionMenuConfig)
37
+ {
38
+ if (imageURLs.count == 0)
39
+ return nil;
40
+
41
+ NSString *urlsToCopy = [imageURLs componentsJoinedByString:@"\n"];
42
+ NSString *title = ENRMResolveImageURLsTitle(selectionMenuConfig, imageURLs.count);
43
+
44
+ return [UIAction actionWithTitle:title
45
+ image:[RCTUIImage systemImageNamed:@"link"]
46
+ identifier:kActionIdentifierCopyImageURL
47
+ handler:^(__kindof UIAction *action) { copyStringToPasteboard(urlsToCopy); }];
48
+ }
49
+
50
+ /// Rebuilds the standard-edit menu with the system Copy swapped for the enhanced
51
+ /// copy action. All other system items are kept — dropping them would remove
52
+ /// Select All, which on iOS 16+ is the only way to start a selection from the
53
+ /// long-press menu of a non-editable text view.
54
+ static UIMenu *createEnhancedStandardEditMenu(UIMenu *originalMenu, UIAction *copyAction)
55
+ {
56
+ NSMutableArray<UIMenuElement *> *children = [NSMutableArray arrayWithCapacity:originalMenu.children.count];
57
+ BOOL replacedCopy = NO;
58
+
59
+ for (UIMenuElement *element in originalMenu.children) {
60
+ if (!replacedCopy && [element isKindOfClass:[UICommand class]] &&
61
+ ((UICommand *)element).action == @selector(copy:)) {
62
+ [children addObject:copyAction];
63
+ replacedCopy = YES;
64
+ continue;
65
+ }
66
+ [children addObject:element];
67
+ }
68
+
69
+ if (!replacedCopy) {
70
+ [children insertObject:copyAction atIndex:0];
71
+ }
72
+
73
+ return [UIMenu menuWithTitle:originalMenu.title
74
+ image:originalMenu.image
75
+ identifier:originalMenu.identifier
76
+ options:originalMenu.options
77
+ children:children];
78
+ }
79
+
80
+ static void addOptionalAction(NSMutableArray<UIMenuElement *> *array, UIAction *_Nullable action)
81
+ {
82
+ if (action) {
83
+ [array addObject:action];
84
+ }
85
+ }
86
+
87
+ static void insertOptionalAction(NSMutableArray<UIMenuElement *> *array, UIAction *_Nullable action, NSUInteger index)
88
+ {
89
+ if (action) {
90
+ [array insertObject:action atIndex:index];
91
+ }
92
+ }
93
+
94
+ // TODO: Remove API_AVAILABLE(ios(16.0)) guard when the minimum iOS deployment target in RN is bumped to 16.
95
+ UIMenu *buildEditMenuForSelection(NSAttributedString *attributedText, NSRange range, NSString *_Nullable cachedTiptap,
96
+ StyleConfig *styleConfig, NSArray<UIMenuElement *> *suggestedActions,
97
+ NSArray<UIAction *> *_Nullable customActions,
98
+ ENRMSelectionMenuConfig selectionMenuConfig) API_AVAILABLE(ios(16.0))
99
+ {
100
+ NSAttributedString *selectedText = [attributedText attributedSubstringFromRange:range];
101
+ NSString *tiptap = tiptapForRange(attributedText, range, cachedTiptap);
102
+ NSArray<NSString *> *imageURLs = imageURLsInRange(attributedText, range);
103
+
104
+ UIAction *copyAction = createCopyAction(selectedText, tiptap, styleConfig, selectionMenuConfig.copyLabel);
105
+ UIAction *copyTiptapAction = selectionMenuConfig.copyAsTiptap
106
+ ? createCopyTiptapAction(tiptap, selectionMenuConfig.copyAsTiptapLabel)
107
+ : nil;
108
+ UIAction *copyImageURLAction =
109
+ selectionMenuConfig.copyImageURL ? createCopyImageURLAction(imageURLs, selectionMenuConfig) : nil;
110
+
111
+ NSMutableArray<UIMenuElement *> *result = [NSMutableArray array];
112
+ BOOL foundStandardEditMenu = NO;
113
+
114
+ for (UIMenuElement *element in suggestedActions) {
115
+ if ([element isKindOfClass:[UIMenu class]]) {
116
+ UIMenu *menu = (UIMenu *)element;
117
+
118
+ if ([menu.identifier isEqualToString:kMenuIdentifierStandardEdit]) {
119
+ // Replace standard Copy with our enhanced version
120
+ [result addObject:createEnhancedStandardEditMenu(menu, copyAction)];
121
+ addOptionalAction(result, copyTiptapAction);
122
+ addOptionalAction(result, copyImageURLAction);
123
+ foundStandardEditMenu = YES;
124
+ continue;
125
+ }
126
+ }
127
+ [result addObject:element];
128
+ }
129
+
130
+ if (!foundStandardEditMenu) {
131
+ [result insertObject:copyAction atIndex:0];
132
+ insertOptionalAction(result, copyTiptapAction, 1);
133
+ addOptionalAction(result, copyImageURLAction);
134
+ }
135
+
136
+ if (customActions.count > 0) {
137
+ return [UIMenu menuWithChildren:[customActions arrayByAddingObjectsFromArray:result]];
138
+ }
139
+
140
+ return [UIMenu menuWithChildren:result];
141
+ }
142
+
143
+ #endif
@@ -0,0 +1,20 @@
1
+ #pragma once
2
+ #import "ENRMUIKit.h"
3
+
4
+ NS_ASSUME_NONNULL_BEGIN
5
+
6
+ extern NSString *const FactoidAttributeName;
7
+ extern NSString *const FactoidIdAttributeName;
8
+ extern NSString *const FactoidBackgroundColorAttributeName;
9
+ extern NSString *const FactoidBorderColorAttributeName;
10
+
11
+ @interface FactoidBackground : NSObject
12
+
13
+ - (void)drawBackgroundsForGlyphRange:(NSRange)glyphsToShow
14
+ layoutManager:(NSLayoutManager *)layoutManager
15
+ textContainer:(NSTextContainer *)textContainer
16
+ atPoint:(CGPoint)origin;
17
+
18
+ @end
19
+
20
+ NS_ASSUME_NONNULL_END
@@ -0,0 +1,161 @@
1
+ #import "FactoidBackground.h"
2
+
3
+ NSString *const FactoidAttributeName = @"Factoid";
4
+ NSString *const FactoidIdAttributeName = @"factoidId";
5
+ NSString *const FactoidBackgroundColorAttributeName = @"FactoidBackgroundColor";
6
+ NSString *const FactoidBorderColorAttributeName = @"FactoidBorderColor";
7
+
8
+ static const CGFloat kFactoidCornerRadius = 4.0;
9
+ static const CGFloat kFactoidBorderWidth = 1.0;
10
+
11
+ @implementation FactoidBackground
12
+
13
+ - (void)drawBackgroundsForGlyphRange:(NSRange)glyphsToShow
14
+ layoutManager:(NSLayoutManager *)layoutManager
15
+ textContainer:(NSTextContainer *)textContainer
16
+ atPoint:(CGPoint)origin
17
+ {
18
+ NSTextStorage *textStorage = layoutManager.textStorage;
19
+ if (!textStorage || textStorage.length == 0)
20
+ return;
21
+
22
+ NSRange charRange = [layoutManager characterRangeForGlyphRange:glyphsToShow actualGlyphRange:NULL];
23
+ if (charRange.location == NSNotFound || charRange.length == 0)
24
+ return;
25
+
26
+ [textStorage enumerateAttribute:FactoidAttributeName
27
+ inRange:NSMakeRange(0, textStorage.length)
28
+ options:0
29
+ usingBlock:^(id value, NSRange range, BOOL *stop) {
30
+ if (!value || range.length == 0)
31
+ return;
32
+ if (NSIntersectionRange(range, charRange).length == 0)
33
+ return;
34
+
35
+ RCTUIColor *backgroundColor =
36
+ [textStorage attribute:FactoidBackgroundColorAttributeName atIndex:range.location effectiveRange:NULL];
37
+ RCTUIColor *borderColor =
38
+ [textStorage attribute:FactoidBorderColorAttributeName atIndex:range.location effectiveRange:NULL];
39
+ if (!backgroundColor && !borderColor)
40
+ return;
41
+
42
+ [self drawFactoidForRange:range
43
+ layoutManager:layoutManager
44
+ textContainer:textContainer
45
+ atPoint:origin
46
+ backgroundColor:backgroundColor
47
+ borderColor:borderColor];
48
+ }];
49
+ }
50
+
51
+ - (void)drawFactoidForRange:(NSRange)range
52
+ layoutManager:(NSLayoutManager *)layoutManager
53
+ textContainer:(NSTextContainer *)textContainer
54
+ atPoint:(CGPoint)origin
55
+ backgroundColor:(RCTUIColor *)backgroundColor
56
+ borderColor:(RCTUIColor *)borderColor
57
+ {
58
+ NSRange glyphRange = [layoutManager glyphRangeForCharacterRange:range actualCharacterRange:NULL];
59
+ if (glyphRange.location == NSNotFound || glyphRange.length == 0)
60
+ return;
61
+
62
+ [layoutManager
63
+ enumerateLineFragmentsForGlyphRange:glyphRange
64
+ usingBlock:^(CGRect rect, CGRect usedRect, NSTextContainer *tc, NSRange lineRange,
65
+ BOOL *stop) {
66
+ (void)usedRect;
67
+ (void)tc;
68
+ (void)stop;
69
+ NSRange intersect = NSIntersectionRange(lineRange, glyphRange);
70
+ if (intersect.length == 0)
71
+ return;
72
+
73
+ BOOL isFirst = (intersect.location == glyphRange.location);
74
+ BOOL isLast = (NSMaxRange(intersect) == NSMaxRange(glyphRange));
75
+ CGRect textRect = [layoutManager boundingRectForGlyphRange:intersect inTextContainer:textContainer];
76
+ // Full line height, but only as wide as the glyphs. A wrapped factoid stops at
77
+ // the last glyph instead of running out to the line edge.
78
+ CGRect finalRect = CGRectMake(textRect.origin.x + origin.x, rect.origin.y + origin.y,
79
+ textRect.size.width, rect.size.height);
80
+ [self drawBackgroundAndBorders:finalRect
81
+ backgroundColor:backgroundColor
82
+ borderColor:borderColor
83
+ isFirst:isFirst
84
+ isLast:isLast];
85
+ }];
86
+ }
87
+
88
+ - (void)drawBackgroundAndBorders:(CGRect)rect
89
+ backgroundColor:(RCTUIColor *)backgroundColor
90
+ borderColor:(RCTUIColor *)borderColor
91
+ isFirst:(BOOL)isFirst
92
+ isLast:(BOOL)isLast
93
+ {
94
+ UIBezierPath *path = [self pathForRect:rect isFirst:isFirst isLast:isLast];
95
+ if (backgroundColor) {
96
+ [backgroundColor setFill];
97
+ [path fill];
98
+ }
99
+ if (!borderColor)
100
+ return;
101
+
102
+ [borderColor setStroke];
103
+ UIBezierPath *strokePath = (isFirst && isLast) ? path : [self openBorderPathForRect:rect isFirst:isFirst isLast:isLast];
104
+ strokePath.lineWidth = kFactoidBorderWidth;
105
+ BezierPathSetRoundStyle(strokePath);
106
+ [strokePath stroke];
107
+ }
108
+
109
+ - (UIBezierPath *)pathForRect:(CGRect)rect isFirst:(BOOL)isFirst isLast:(BOOL)isLast
110
+ {
111
+ #if !TARGET_OS_OSX
112
+ UIRectCorner corners = 0;
113
+ if (isFirst)
114
+ corners |= (UIRectCornerTopLeft | UIRectCornerBottomLeft);
115
+ if (isLast)
116
+ corners |= (UIRectCornerTopRight | UIRectCornerBottomRight);
117
+
118
+ return [UIBezierPath bezierPathWithRoundedRect:rect
119
+ byRoundingCorners:corners
120
+ cornerRadii:CGSizeMake(kFactoidCornerRadius, kFactoidCornerRadius)];
121
+ #else
122
+ CGFloat cornerRadius = (isFirst || isLast) ? kFactoidCornerRadius : 0;
123
+ return UIBezierPathWithRoundedRect(rect, cornerRadius);
124
+ #endif
125
+ }
126
+
127
+ - (UIBezierPath *)openBorderPathForRect:(CGRect)rect isFirst:(BOOL)isFirst isLast:(BOOL)isLast
128
+ {
129
+ UIBezierPath *path = [UIBezierPath bezierPath];
130
+ CGFloat r = kFactoidCornerRadius;
131
+ CGFloat inset = kFactoidBorderWidth / 2.0;
132
+ CGRect insetRect = CGRectInset(rect, inset, inset);
133
+
134
+ if (isFirst) {
135
+ [path moveToPoint:CGPointMake(CGRectGetMaxX(rect), insetRect.origin.y)];
136
+ BezierPathAddLine(path, CGPointMake(insetRect.origin.x + r, insetRect.origin.y));
137
+ BezierPathAddQuadCurve(path, CGPointMake(insetRect.origin.x, insetRect.origin.y + r),
138
+ CGPointMake(insetRect.origin.x, insetRect.origin.y));
139
+ BezierPathAddLine(path, CGPointMake(insetRect.origin.x, CGRectGetMaxY(insetRect) - r));
140
+ BezierPathAddQuadCurve(path, CGPointMake(insetRect.origin.x + r, CGRectGetMaxY(insetRect)),
141
+ CGPointMake(insetRect.origin.x, CGRectGetMaxY(insetRect)));
142
+ BezierPathAddLine(path, CGPointMake(CGRectGetMaxX(rect), CGRectGetMaxY(insetRect)));
143
+ } else if (isLast) {
144
+ [path moveToPoint:CGPointMake(rect.origin.x, insetRect.origin.y)];
145
+ BezierPathAddLine(path, CGPointMake(CGRectGetMaxX(insetRect) - r, insetRect.origin.y));
146
+ BezierPathAddQuadCurve(path, CGPointMake(CGRectGetMaxX(insetRect), insetRect.origin.y + r),
147
+ CGPointMake(CGRectGetMaxX(insetRect), insetRect.origin.y));
148
+ BezierPathAddLine(path, CGPointMake(CGRectGetMaxX(insetRect), CGRectGetMaxY(insetRect) - r));
149
+ BezierPathAddQuadCurve(path, CGPointMake(CGRectGetMaxX(insetRect) - r, CGRectGetMaxY(insetRect)),
150
+ CGPointMake(CGRectGetMaxX(insetRect), CGRectGetMaxY(insetRect)));
151
+ BezierPathAddLine(path, CGPointMake(rect.origin.x, CGRectGetMaxY(insetRect)));
152
+ } else {
153
+ [path moveToPoint:CGPointMake(rect.origin.x, insetRect.origin.y)];
154
+ BezierPathAddLine(path, CGPointMake(CGRectGetMaxX(rect), insetRect.origin.y));
155
+ [path moveToPoint:CGPointMake(rect.origin.x, CGRectGetMaxY(insetRect))];
156
+ BezierPathAddLine(path, CGPointMake(CGRectGetMaxX(rect), CGRectGetMaxY(insetRect)));
157
+ }
158
+ return path;
159
+ }
160
+
161
+ @end
@@ -0,0 +1,10 @@
1
+ #import "ENRMUIKit.h"
2
+
3
+ @interface FontScaleObserver : NSObject
4
+
5
+ @property (nonatomic, assign) BOOL allowFontScaling;
6
+ @property (nonatomic, readonly) CGFloat effectiveFontScale;
7
+
8
+ @property (nonatomic, copy, nullable) void (^onChange)(void);
9
+
10
+ @end
@@ -0,0 +1,55 @@
1
+ #import "FontScaleObserver.h"
2
+ #import <React/RCTUtils.h>
3
+ #include <TargetConditionals.h>
4
+
5
+ @implementation FontScaleObserver {
6
+ CGFloat _currentFontScale;
7
+ }
8
+
9
+ - (instancetype)init
10
+ {
11
+ if (self = [super init]) {
12
+ _allowFontScaling = YES;
13
+ _currentFontScale = RCTFontSizeMultiplier();
14
+
15
+ #if !TARGET_OS_OSX
16
+ [[NSNotificationCenter defaultCenter] addObserver:self
17
+ selector:@selector(contentSizeCategoryDidChange:)
18
+ name:UIContentSizeCategoryDidChangeNotification
19
+ object:nil];
20
+ #endif
21
+ // TODO: Observe macOS system font size changes. UIContentSizeCategoryDidChangeNotification
22
+ // is iOS-only; macOS has no direct equivalent. Possible approaches: KVO on
23
+ // NSApplication.effectiveAppearance or polling NSFont.systemFontSize.
24
+ }
25
+ return self;
26
+ }
27
+
28
+ - (void)dealloc
29
+ {
30
+ #if !TARGET_OS_OSX
31
+ [[NSNotificationCenter defaultCenter] removeObserver:self name:UIContentSizeCategoryDidChangeNotification object:nil];
32
+ #endif
33
+ }
34
+
35
+ - (CGFloat)effectiveFontScale
36
+ {
37
+ return _allowFontScaling ? _currentFontScale : 1.0;
38
+ }
39
+
40
+ - (void)contentSizeCategoryDidChange:(NSNotification *)notification
41
+ {
42
+ if (!_allowFontScaling) {
43
+ return;
44
+ }
45
+
46
+ CGFloat newFontScale = RCTFontSizeMultiplier();
47
+ if (_currentFontScale != newFontScale) {
48
+ _currentFontScale = newFontScale;
49
+ if (self.onChange) {
50
+ self.onChange();
51
+ }
52
+ }
53
+ }
54
+
55
+ @end
@@ -0,0 +1,31 @@
1
+ #import "ENRMUIKit.h"
2
+ #import <Foundation/Foundation.h>
3
+
4
+ @class BlockStyle;
5
+ @class RenderContext;
6
+
7
+ NS_ASSUME_NONNULL_BEGIN
8
+
9
+ #ifdef __cplusplus
10
+ extern "C" {
11
+ #endif
12
+
13
+ /** Returns a cached UIFont from BlockStyle properties via RenderContext. */
14
+ extern UIFont *cachedFontFromBlockStyle(BlockStyle *blockStyle, RenderContext *context);
15
+
16
+ /** Returns the font scale multiplier, capped by maxFontSizeMultiplier.
17
+ * Uses React Native's RCTFontSizeMultiplier() internally.
18
+ * @param maxFontSizeMultiplier Values >= 1.0 cap the result, < 1.0 means no cap. */
19
+ extern CGFloat RCTFontSizeMultiplierWithMax(CGFloat maxFontSizeMultiplier);
20
+
21
+ /** Converts a CSS-style font weight string to a UIFontWeight constant.
22
+ * Mirrors React Native's RCTFont table: "100"/"ultralight" through
23
+ * "900"/"black", plus the "normal"/"regular"/"bold"/etc. aliases.
24
+ * Returns UIFontWeightRegular for unrecognised or nil input. */
25
+ extern UIFontWeight ENRMFontWeightFromString(NSString *_Nullable weightString);
26
+
27
+ #ifdef __cplusplus
28
+ }
29
+ #endif
30
+
31
+ NS_ASSUME_NONNULL_END
@@ -0,0 +1,63 @@
1
+ #import "FontUtils.h"
2
+ #import "RenderContext.h"
3
+ #import <React/RCTUtils.h>
4
+
5
+ UIFont *cachedFontFromBlockStyle(BlockStyle *blockStyle, RenderContext *context)
6
+ {
7
+ if (!blockStyle) {
8
+ return nil;
9
+ }
10
+ if (blockStyle.cachedFont) {
11
+ return blockStyle.cachedFont;
12
+ }
13
+ return [context cachedFontForSize:blockStyle.fontSize family:blockStyle.fontFamily weight:blockStyle.fontWeight];
14
+ }
15
+
16
+ CGFloat RCTFontSizeMultiplierWithMax(CGFloat maxFontSizeMultiplier)
17
+ {
18
+ CGFloat multiplier = RCTFontSizeMultiplier();
19
+
20
+ // Apply maxFontSizeMultiplier cap if >= 1.0
21
+ // Values < 1.0 (including 0 and NaN) mean no cap is applied
22
+ if (!isnan(maxFontSizeMultiplier) && maxFontSizeMultiplier >= 1.0) {
23
+ return fmin(maxFontSizeMultiplier, multiplier);
24
+ }
25
+
26
+ return multiplier;
27
+ }
28
+
29
+ UIFontWeight ENRMFontWeightFromString(NSString *weightString)
30
+ {
31
+ if (weightString.length == 0) {
32
+ return UIFontWeightRegular;
33
+ }
34
+ if ([weightString isEqualToString:@"ultralight"] || [weightString isEqualToString:@"100"]) {
35
+ return UIFontWeightUltraLight;
36
+ }
37
+ if ([weightString isEqualToString:@"thin"] || [weightString isEqualToString:@"200"]) {
38
+ return UIFontWeightThin;
39
+ }
40
+ if ([weightString isEqualToString:@"light"] || [weightString isEqualToString:@"300"]) {
41
+ return UIFontWeightLight;
42
+ }
43
+ if ([weightString isEqualToString:@"normal"] || [weightString isEqualToString:@"regular"] ||
44
+ [weightString isEqualToString:@"400"]) {
45
+ return UIFontWeightRegular;
46
+ }
47
+ if ([weightString isEqualToString:@"medium"] || [weightString isEqualToString:@"500"]) {
48
+ return UIFontWeightMedium;
49
+ }
50
+ if ([weightString isEqualToString:@"semibold"] || [weightString isEqualToString:@"600"]) {
51
+ return UIFontWeightSemibold;
52
+ }
53
+ if ([weightString isEqualToString:@"bold"] || [weightString isEqualToString:@"700"]) {
54
+ return UIFontWeightBold;
55
+ }
56
+ if ([weightString isEqualToString:@"heavy"] || [weightString isEqualToString:@"800"]) {
57
+ return UIFontWeightHeavy;
58
+ }
59
+ if ([weightString isEqualToString:@"black"] || [weightString isEqualToString:@"900"]) {
60
+ return UIFontWeightBlack;
61
+ }
62
+ return UIFontWeightRegular;
63
+ }
@@ -0,0 +1,25 @@
1
+ #pragma once
2
+ #import "ENRMUIKit.h"
3
+ #import <Foundation/Foundation.h>
4
+
5
+ @class StyleConfig;
6
+
7
+ NS_ASSUME_NONNULL_BEGIN
8
+
9
+ #ifdef __cplusplus
10
+ extern "C" {
11
+ #endif
12
+
13
+ /// Generates semantic HTML with inline styles (email-client compatible).
14
+ /// Document direction is read from the first paragraph style of `attributedString`.
15
+ NSString *_Nullable generateHTML(NSAttributedString *attributedString, StyleConfig *styleConfig);
16
+
17
+ /// Generates an HTML `<table>` with inline styles from rows of cell dictionaries.
18
+ /// Table direction is read from the first paragraph style of the first non-empty cell.
19
+ NSString *_Nullable generateTableHTML(NSArray<NSArray<NSDictionary *> *> *rows, StyleConfig *styleConfig);
20
+
21
+ #ifdef __cplusplus
22
+ }
23
+ #endif
24
+
25
+ NS_ASSUME_NONNULL_END