@mathers101/react-native-render-rich-text 0.1.9 → 0.1.14

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 (327) hide show
  1. package/LICENSE +20 -20
  2. package/README.md +140 -140
  3. package/ReactNativeRenderRichText.podspec +23 -23
  4. package/android/build.gradle +86 -86
  5. package/android/consumer-rules.pro +3 -3
  6. package/android/src/main/AndroidManifest.xml +2 -2
  7. package/android/src/main/java/com/renderrichtext/EnrichedTiptapTextLayoutManager.kt +24 -24
  8. package/android/src/main/java/com/renderrichtext/EnrichedTiptapTextPackage.kt +13 -13
  9. package/android/src/main/java/com/renderrichtext/MeasurementStore.kt +644 -644
  10. package/android/src/main/java/com/renderrichtext/accessibility/AccessibilityLabels.kt +17 -17
  11. package/android/src/main/java/com/renderrichtext/accessibility/AccessibleTiptapTextView.kt +112 -112
  12. package/android/src/main/java/com/renderrichtext/accessibility/TiptapAccessibilityHelper.kt +576 -576
  13. package/android/src/main/java/com/renderrichtext/events/CodeBlockPressEvent.kt +24 -24
  14. package/android/src/main/java/com/renderrichtext/events/ContextMenuItemPressEvent.kt +28 -28
  15. package/android/src/main/java/com/renderrichtext/events/CopyPressEvent.kt +24 -24
  16. package/android/src/main/java/com/renderrichtext/events/ImagePressEvent.kt +25 -25
  17. package/android/src/main/java/com/renderrichtext/events/LatexErrorEvent.kt +29 -29
  18. package/android/src/main/java/com/renderrichtext/events/LinkLongPressEvent.kt +23 -23
  19. package/android/src/main/java/com/renderrichtext/events/LinkPressEvent.kt +23 -23
  20. package/android/src/main/java/com/renderrichtext/events/MentionLongPressEvent.kt +25 -25
  21. package/android/src/main/java/com/renderrichtext/events/MentionPressEvent.kt +25 -25
  22. package/android/src/main/java/com/renderrichtext/events/TaskListItemPressEvent.kt +26 -26
  23. package/android/src/main/java/com/renderrichtext/math/LatexErrorReporter.kt +9 -9
  24. package/android/src/main/java/com/renderrichtext/parser/Parser.kt +59 -59
  25. package/android/src/main/java/com/renderrichtext/parser/TextLinkMatching.kt +35 -35
  26. package/android/src/main/java/com/renderrichtext/renderer/BaselineShiftRenderer.kt +45 -45
  27. package/android/src/main/java/com/renderrichtext/renderer/BlankLineRenderer.kt +39 -39
  28. package/android/src/main/java/com/renderrichtext/renderer/BlockquoteRenderer.kt +243 -243
  29. package/android/src/main/java/com/renderrichtext/renderer/BlockquoteTextRenderer.kt +56 -56
  30. package/android/src/main/java/com/renderrichtext/renderer/CodeBlockRenderer.kt +135 -135
  31. package/android/src/main/java/com/renderrichtext/renderer/CodeRenderer.kt +37 -37
  32. package/android/src/main/java/com/renderrichtext/renderer/EmphasisRenderer.kt +28 -28
  33. package/android/src/main/java/com/renderrichtext/renderer/HeadingRenderer.kt +81 -81
  34. package/android/src/main/java/com/renderrichtext/renderer/HighlightRenderer.kt +26 -26
  35. package/android/src/main/java/com/renderrichtext/renderer/LineBreakRenderer.kt +17 -17
  36. package/android/src/main/java/com/renderrichtext/renderer/LinkRenderer.kt +90 -90
  37. package/android/src/main/java/com/renderrichtext/renderer/ListContextManager.kt +109 -109
  38. package/android/src/main/java/com/renderrichtext/renderer/ListItemRenderer.kt +211 -211
  39. package/android/src/main/java/com/renderrichtext/renderer/ListRenderer.kt +133 -133
  40. package/android/src/main/java/com/renderrichtext/renderer/MentionRenderer.kt +85 -85
  41. package/android/src/main/java/com/renderrichtext/renderer/ParagraphRenderer.kt +91 -91
  42. package/android/src/main/java/com/renderrichtext/renderer/Renderer.kt +148 -148
  43. package/android/src/main/java/com/renderrichtext/renderer/SoftBreakRenderer.kt +17 -17
  44. package/android/src/main/java/com/renderrichtext/renderer/SpanStyleCache.kt +143 -143
  45. package/android/src/main/java/com/renderrichtext/renderer/StrikethroughRenderer.kt +28 -28
  46. package/android/src/main/java/com/renderrichtext/renderer/StrongRenderer.kt +28 -28
  47. package/android/src/main/java/com/renderrichtext/renderer/TextRenderer.kt +31 -31
  48. package/android/src/main/java/com/renderrichtext/renderer/ThematicBreakRenderer.kt +46 -46
  49. package/android/src/main/java/com/renderrichtext/renderer/UnderlineRenderer.kt +28 -28
  50. package/android/src/main/java/com/renderrichtext/spans/BaseListSpan.kt +164 -164
  51. package/android/src/main/java/com/renderrichtext/spans/BaselineShiftSpan.kt +27 -27
  52. package/android/src/main/java/com/renderrichtext/spans/BlockquoteSpan.kt +302 -302
  53. package/android/src/main/java/com/renderrichtext/spans/CodeBackgroundSpan.kt +205 -205
  54. package/android/src/main/java/com/renderrichtext/spans/CodeBlockSpan.kt +216 -216
  55. package/android/src/main/java/com/renderrichtext/spans/CodeSpan.kt +32 -32
  56. package/android/src/main/java/com/renderrichtext/spans/EmphasisSpan.kt +42 -42
  57. package/android/src/main/java/com/renderrichtext/spans/FadeInSpan.kt +29 -29
  58. package/android/src/main/java/com/renderrichtext/spans/HeadingSpan.kt +38 -38
  59. package/android/src/main/java/com/renderrichtext/spans/HighlightSpan.kt +80 -80
  60. package/android/src/main/java/com/renderrichtext/spans/ImageSpan.kt +481 -481
  61. package/android/src/main/java/com/renderrichtext/spans/InlineBackgroundGeometry.kt +42 -42
  62. package/android/src/main/java/com/renderrichtext/spans/LineHeightSpan.kt +39 -39
  63. package/android/src/main/java/com/renderrichtext/spans/LinkPillIconCache.kt +154 -154
  64. package/android/src/main/java/com/renderrichtext/spans/LinkPillSpan.kt +381 -381
  65. package/android/src/main/java/com/renderrichtext/spans/LinkSpan.kt +68 -68
  66. package/android/src/main/java/com/renderrichtext/spans/ListItemSpacingSpan.kt +33 -33
  67. package/android/src/main/java/com/renderrichtext/spans/ListMarkerAnchorSpan.kt +38 -38
  68. package/android/src/main/java/com/renderrichtext/spans/MarginBottomSpan.kt +76 -76
  69. package/android/src/main/java/com/renderrichtext/spans/MentionChipSpan.kt +132 -132
  70. package/android/src/main/java/com/renderrichtext/spans/MentionSpan.kt +46 -46
  71. package/android/src/main/java/com/renderrichtext/spans/OrderedListSpan.kt +127 -127
  72. package/android/src/main/java/com/renderrichtext/spans/SpoilerSpan.kt +33 -33
  73. package/android/src/main/java/com/renderrichtext/spans/StrikethroughSpan.kt +12 -12
  74. package/android/src/main/java/com/renderrichtext/spans/StrongSpan.kt +39 -39
  75. package/android/src/main/java/com/renderrichtext/spans/TaskListSpan.kt +143 -143
  76. package/android/src/main/java/com/renderrichtext/spans/TextSpan.kt +26 -26
  77. package/android/src/main/java/com/renderrichtext/spans/ThematicBreakSpan.kt +69 -69
  78. package/android/src/main/java/com/renderrichtext/spans/UnorderedListSpan.kt +96 -96
  79. package/android/src/main/java/com/renderrichtext/spoiler/SpoilerStubs.kt +46 -46
  80. package/android/src/main/java/com/renderrichtext/styles/BaseBlockStyle.kt +11 -11
  81. package/android/src/main/java/com/renderrichtext/styles/BlockquoteStyle.kt +83 -83
  82. package/android/src/main/java/com/renderrichtext/styles/CodeBlockStyle.kt +80 -80
  83. package/android/src/main/java/com/renderrichtext/styles/CodeStyle.kt +26 -26
  84. package/android/src/main/java/com/renderrichtext/styles/EmphasisStyle.kt +21 -21
  85. package/android/src/main/java/com/renderrichtext/styles/FactoidStyle.kt +21 -21
  86. package/android/src/main/java/com/renderrichtext/styles/HeadingStyle.kt +33 -33
  87. package/android/src/main/java/com/renderrichtext/styles/HighlightStyle.kt +19 -19
  88. package/android/src/main/java/com/renderrichtext/styles/ImageStyle.kt +29 -29
  89. package/android/src/main/java/com/renderrichtext/styles/InlineImageStyle.kt +17 -17
  90. package/android/src/main/java/com/renderrichtext/styles/InlineMathStyle.kt +17 -17
  91. package/android/src/main/java/com/renderrichtext/styles/LinkPillContent.kt +36 -36
  92. package/android/src/main/java/com/renderrichtext/styles/LinkPillStyle.kt +44 -44
  93. package/android/src/main/java/com/renderrichtext/styles/LinkStyle.kt +23 -23
  94. package/android/src/main/java/com/renderrichtext/styles/LinkVariantEntry.kt +34 -34
  95. package/android/src/main/java/com/renderrichtext/styles/ListStyle.kt +65 -65
  96. package/android/src/main/java/com/renderrichtext/styles/MathStyle.kt +29 -29
  97. package/android/src/main/java/com/renderrichtext/styles/MentionStyle.kt +19 -19
  98. package/android/src/main/java/com/renderrichtext/styles/ParagraphStyle.kt +33 -33
  99. package/android/src/main/java/com/renderrichtext/styles/SpoilerStyle.kt +27 -27
  100. package/android/src/main/java/com/renderrichtext/styles/StrikethroughStyle.kt +17 -17
  101. package/android/src/main/java/com/renderrichtext/styles/StrongStyle.kt +21 -21
  102. package/android/src/main/java/com/renderrichtext/styles/StyleConfig.kt +411 -411
  103. package/android/src/main/java/com/renderrichtext/styles/StyleParser.kt +92 -92
  104. package/android/src/main/java/com/renderrichtext/styles/SubscriptStyle.kt +16 -16
  105. package/android/src/main/java/com/renderrichtext/styles/SuperscriptStyle.kt +16 -16
  106. package/android/src/main/java/com/renderrichtext/styles/TableStyle.kt +75 -75
  107. package/android/src/main/java/com/renderrichtext/styles/TaskListStyle.kt +29 -29
  108. package/android/src/main/java/com/renderrichtext/styles/TextAlignment.kt +32 -32
  109. package/android/src/main/java/com/renderrichtext/styles/ThematicBreakStyle.kt +23 -23
  110. package/android/src/main/java/com/renderrichtext/styles/UnderlineStyle.kt +17 -17
  111. package/android/src/main/java/com/renderrichtext/styles/VideoStyle.kt +31 -31
  112. package/android/src/main/java/com/renderrichtext/utils/common/BorderStyleUtils.kt +86 -86
  113. package/android/src/main/java/com/renderrichtext/utils/common/BreakStrategyUtils.kt +32 -32
  114. package/android/src/main/java/com/renderrichtext/utils/common/CodeBlockHighlighter.kt +36 -36
  115. package/android/src/main/java/com/renderrichtext/utils/common/CodeBlockNode.kt +42 -42
  116. package/android/src/main/java/com/renderrichtext/utils/common/EllipsizeUtils.kt +27 -27
  117. package/android/src/main/java/com/renderrichtext/utils/common/EnrichedTiptapAncestorUtils.kt +10 -10
  118. package/android/src/main/java/com/renderrichtext/utils/common/FeatureFlags.kt +9 -9
  119. package/android/src/main/java/com/renderrichtext/utils/common/LinkRecognitionProps.kt +31 -31
  120. package/android/src/main/java/com/renderrichtext/utils/common/LinkRegexConfig.kt +56 -56
  121. package/android/src/main/java/com/renderrichtext/utils/common/MotionPreferences.kt +18 -18
  122. package/android/src/main/java/com/renderrichtext/utils/common/ReadableMapExtensions.kt +28 -28
  123. package/android/src/main/java/com/renderrichtext/utils/common/layout/RTLUtils.kt +6 -6
  124. package/android/src/main/java/com/renderrichtext/utils/common/serialization/TiptapASTSerializer.kt +368 -368
  125. package/android/src/main/java/com/renderrichtext/utils/text/ImageCache.kt +88 -88
  126. package/android/src/main/java/com/renderrichtext/utils/text/ImageDownloader.kt +203 -203
  127. package/android/src/main/java/com/renderrichtext/utils/text/LocalImageLoader.kt +167 -167
  128. package/android/src/main/java/com/renderrichtext/utils/text/TailFadeInAnimator.kt +84 -84
  129. package/android/src/main/java/com/renderrichtext/utils/text/conversion/HTMLGenerator.kt +1105 -1105
  130. package/android/src/main/java/com/renderrichtext/utils/text/conversion/TiptapExtractor.kt +423 -423
  131. package/android/src/main/java/com/renderrichtext/utils/text/extensions/ParagraphUtils.kt +9 -9
  132. package/android/src/main/java/com/renderrichtext/utils/text/extensions/SpannableExtensions.kt +9 -9
  133. package/android/src/main/java/com/renderrichtext/utils/text/extensions/TextPaintExtensions.kt +76 -76
  134. package/android/src/main/java/com/renderrichtext/utils/text/interaction/CheckboxTouchHelper.kt +61 -61
  135. package/android/src/main/java/com/renderrichtext/utils/text/interaction/TaskListTapUtils.kt +286 -286
  136. package/android/src/main/java/com/renderrichtext/utils/text/span/ApplyLineHeight.kt +39 -39
  137. package/android/src/main/java/com/renderrichtext/utils/text/span/BlockSpacing.kt +142 -142
  138. package/android/src/main/java/com/renderrichtext/utils/text/span/SpanFlags.kt +43 -43
  139. package/android/src/main/java/com/renderrichtext/utils/text/span/WidthAwareSpans.kt +30 -30
  140. package/android/src/main/java/com/renderrichtext/utils/text/view/CodeBlockPressHost.kt +15 -15
  141. package/android/src/main/java/com/renderrichtext/utils/text/view/ImagePressHost.kt +19 -19
  142. package/android/src/main/java/com/renderrichtext/utils/text/view/SelectionActionMode.kt +235 -235
  143. package/android/src/main/java/com/renderrichtext/utils/text/view/TextSelectionColors.kt +48 -48
  144. package/android/src/main/java/com/renderrichtext/utils/text/view/TextViewSetup.kt +119 -119
  145. package/android/src/main/java/com/renderrichtext/views/ContextMenuPopup.kt +217 -217
  146. package/android/src/main/java/com/renderrichtext/views/CopyGlyph.kt +101 -101
  147. package/android/src/main/java/com/renderrichtext/views/WrapGlyph.kt +40 -40
  148. package/android/src/main/jni/CMakeLists.txt +52 -52
  149. package/android/src/main/jni/react/renderer/components/RichTextSpec/ComponentDescriptors.h +30 -30
  150. package/android/src/main/jni/react/renderer/components/RichTextSpec/TiptapTextComponentDescriptor.h +29 -29
  151. package/android/src/main/jni/react/renderer/components/RichTextSpec/TiptapTextMeasurementManager.cpp +45 -45
  152. package/android/src/main/jni/react/renderer/components/RichTextSpec/TiptapTextMeasurementManager.h +21 -21
  153. package/android/src/main/jni/react/renderer/components/RichTextSpec/TiptapTextShadowNode.cpp +38 -38
  154. package/android/src/main/jni/react/renderer/components/RichTextSpec/TiptapTextShadowNode.h +53 -53
  155. package/android/src/main/jni/react/renderer/components/RichTextSpec/TiptapTextState.cpp +9 -9
  156. package/android/src/main/jni/react/renderer/components/RichTextSpec/TiptapTextState.h +24 -24
  157. package/android/src/main/jni/react/renderer/components/RichTextSpec/conversions.h +40 -40
  158. package/cpp/parser/TiptapParser.hpp +13 -13
  159. package/cpp/vendor/nlohmann/json.hpp +24765 -24765
  160. package/ios/EnrichedTiptapText.h +27 -27
  161. package/ios/attachments/ENRMImageAttachment.h +51 -51
  162. package/ios/attachments/ENRMImageAttachment.m +398 -398
  163. package/ios/attachments/ENRMLinkPillAttachment.h +47 -47
  164. package/ios/attachments/ENRMLinkPillAttachment.m +324 -324
  165. package/ios/attachments/ENRMLinkPillIconCache.h +28 -28
  166. package/ios/attachments/ENRMLinkPillIconCache.m +181 -181
  167. package/ios/attachments/ENRMLinkPillText.h +27 -27
  168. package/ios/attachments/ENRMLinkPillText.m +118 -118
  169. package/ios/attachments/ENRMMathInlineAttachment.h +7 -7
  170. package/ios/attachments/ENRMMathInlineAttachment.m +4 -4
  171. package/ios/attachments/ThematicBreakAttachment.h +15 -15
  172. package/ios/attachments/ThematicBreakAttachment.m +33 -33
  173. package/ios/internals/ENRMViewFreeMeasurement.h +208 -208
  174. package/ios/internals/EnrichedTiptapTextComponentDescriptor.h +19 -19
  175. package/ios/internals/EnrichedTiptapTextShadowNode.h +43 -43
  176. package/ios/internals/EnrichedTiptapTextShadowNode.mm +69 -69
  177. package/ios/internals/EnrichedTiptapTextState.h +24 -24
  178. package/ios/internals/MeasurementCache.h +308 -308
  179. package/ios/internals/ShadowMeasurementUtils.h +145 -145
  180. package/ios/parser/ENRMTextLinkAttributes.h +7 -7
  181. package/ios/parser/ENRMTiptapParser.h +33 -33
  182. package/ios/parser/ENRMTiptapParser.mm +73 -73
  183. package/ios/parser/TiptapASTNode.m +52 -52
  184. package/ios/renderer/AttributedRenderer.h +23 -23
  185. package/ios/renderer/AttributedRenderer.m +229 -229
  186. package/ios/renderer/BaseRenderer.h +33 -33
  187. package/ios/renderer/BaseRenderer.m +46 -46
  188. package/ios/renderer/BaselineShiftTextAttributes.h +10 -10
  189. package/ios/renderer/BaselineShiftTextAttributes.m +26 -26
  190. package/ios/renderer/BlankLineRenderer.h +4 -4
  191. package/ios/renderer/BlankLineRenderer.m +51 -51
  192. package/ios/renderer/BlockquoteRenderer.h +6 -6
  193. package/ios/renderer/BlockquoteRenderer.m +258 -258
  194. package/ios/renderer/CodeBlockRenderer.h +9 -9
  195. package/ios/renderer/CodeBlockRenderer.m +99 -99
  196. package/ios/renderer/CodeRenderer.h +9 -9
  197. package/ios/renderer/CodeRenderer.m +69 -69
  198. package/ios/renderer/ENRMBlockquoteTextRenderer.h +25 -25
  199. package/ios/renderer/ENRMBlockquoteTextRenderer.m +48 -48
  200. package/ios/renderer/EmphasisRenderer.h +5 -5
  201. package/ios/renderer/EmphasisRenderer.m +99 -99
  202. package/ios/renderer/HeadingRenderer.h +6 -6
  203. package/ios/renderer/HeadingRenderer.m +102 -102
  204. package/ios/renderer/HighlightRenderer.h +7 -7
  205. package/ios/renderer/HighlightRenderer.m +33 -33
  206. package/ios/renderer/LinkRenderer.h +6 -6
  207. package/ios/renderer/LinkRenderer.m +157 -157
  208. package/ios/renderer/ListItemRenderer.h +24 -24
  209. package/ios/renderer/ListItemRenderer.m +283 -283
  210. package/ios/renderer/ListRenderer.h +13 -13
  211. package/ios/renderer/ListRenderer.m +126 -126
  212. package/ios/renderer/MentionRenderer.h +9 -9
  213. package/ios/renderer/MentionRenderer.m +96 -96
  214. package/ios/renderer/NodeRenderer.h +8 -8
  215. package/ios/renderer/ParagraphRenderer.h +6 -6
  216. package/ios/renderer/ParagraphRenderer.m +85 -85
  217. package/ios/renderer/RenderContext.h +145 -145
  218. package/ios/renderer/RenderContext.m +402 -402
  219. package/ios/renderer/RendererFactory.h +12 -12
  220. package/ios/renderer/StrikethroughRenderer.h +5 -5
  221. package/ios/renderer/StrikethroughRenderer.m +30 -30
  222. package/ios/renderer/StrongRenderer.h +5 -5
  223. package/ios/renderer/StrongRenderer.m +87 -87
  224. package/ios/renderer/TextRenderer.h +6 -6
  225. package/ios/renderer/TextRenderer.m +18 -18
  226. package/ios/renderer/ThematicBreakRenderer.h +4 -4
  227. package/ios/renderer/ThematicBreakRenderer.m +41 -41
  228. package/ios/renderer/UnderlineRenderer.h +4 -4
  229. package/ios/renderer/UnderlineRenderer.m +41 -41
  230. package/ios/styles/ENRMFontSlot.h +12 -12
  231. package/ios/styles/ENRMFontSlot.m +24 -24
  232. package/ios/styles/StyleConfig.h +488 -488
  233. package/ios/styles/StyleConfig.mm +2820 -2820
  234. package/ios/utils/AccessibilityInfo.h +35 -35
  235. package/ios/utils/AccessibilityInfo.m +24 -24
  236. package/ios/utils/BlockquoteBorder.h +26 -26
  237. package/ios/utils/BlockquoteBorder.m +294 -294
  238. package/ios/utils/CodeBackground.h +19 -19
  239. package/ios/utils/CodeBackground.m +196 -196
  240. package/ios/utils/CodeBlockBackground.h +17 -17
  241. package/ios/utils/CodeBlockBackground.m +102 -102
  242. package/ios/utils/ContextMenuUtils.h +76 -76
  243. package/ios/utils/ContextMenuUtils.mm +75 -75
  244. package/ios/utils/ENRMAccessibilityLabels.h +40 -40
  245. package/ios/utils/ENRMAccessibilityLabels.m +5 -5
  246. package/ios/utils/ENRMAsyncRenderCoordinator.h +24 -24
  247. package/ios/utils/ENRMAsyncRenderCoordinator.m +37 -37
  248. package/ios/utils/ENRMAtomicSize.h +65 -65
  249. package/ios/utils/ENRMCodeBlockContent.h +37 -37
  250. package/ios/utils/ENRMCodeBlockContent.mm +89 -89
  251. package/ios/utils/ENRMFeatureFlags.h +25 -25
  252. package/ios/utils/ENRMImageDownloader.h +30 -30
  253. package/ios/utils/ENRMImageDownloader.m +168 -168
  254. package/ios/utils/ENRMLatexErrorCoordinator.h +27 -27
  255. package/ios/utils/ENRMLatexErrorCoordinator.mm +75 -75
  256. package/ios/utils/ENRMLatexErrorReporting.h +13 -13
  257. package/ios/utils/ENRMLinkContextMenus.h +93 -93
  258. package/ios/utils/ENRMLinkContextMenus.m +178 -178
  259. package/ios/utils/ENRMLinkRegexConfig.h +30 -30
  260. package/ios/utils/ENRMLinkRegexConfig.mm +104 -104
  261. package/ios/utils/ENRMLinkRegexProps.h +23 -23
  262. package/ios/utils/ENRMLocalImageLoader.h +35 -35
  263. package/ios/utils/ENRMLocalImageLoader.m +111 -111
  264. package/ios/utils/ENRMMenuAction.h +27 -27
  265. package/ios/utils/ENRMMenuAction.m +33 -33
  266. package/ios/utils/ENRMSpoilerOverlayManager.h +15 -15
  267. package/ios/utils/ENRMSpoilerOverlayManager.m +19 -19
  268. package/ios/utils/ENRMSpoilerTapUtils.h +6 -6
  269. package/ios/utils/ENRMSpoilerTapUtils.m +11 -11
  270. package/ios/utils/ENRMTailFadeInAnimator.h +16 -16
  271. package/ios/utils/ENRMTailFadeInAnimator.m +161 -161
  272. package/ios/utils/ENRMTextHitTest.h +23 -23
  273. package/ios/utils/ENRMTextHitTest.m +20 -20
  274. package/ios/utils/ENRMTextInteractionUtils.h +20 -20
  275. package/ios/utils/ENRMTextInteractionUtils.m +15 -15
  276. package/ios/utils/ENRMTextRenderer.h +38 -38
  277. package/ios/utils/ENRMTextRenderer.m +54 -54
  278. package/ios/utils/ENRMTextViewSetup.h +132 -132
  279. package/ios/utils/ENRMUIKit.h +429 -429
  280. package/ios/utils/EditMenuUtils.h +105 -105
  281. package/ios/utils/EditMenuUtils.m +143 -143
  282. package/ios/utils/FontScaleObserver.h +10 -10
  283. package/ios/utils/FontScaleObserver.m +55 -55
  284. package/ios/utils/FontUtils.h +31 -31
  285. package/ios/utils/FontUtils.m +63 -63
  286. package/ios/utils/HTMLGenerator.h +25 -25
  287. package/ios/utils/HTMLGenerator.m +1041 -1041
  288. package/ios/utils/HeightUpdateUtils.h +25 -25
  289. package/ios/utils/ImageRequestHeaderUtils.h +35 -35
  290. package/ios/utils/LastElementUtils.h +97 -97
  291. package/ios/utils/LinkContextMenuUtils.h +55 -55
  292. package/ios/utils/LinkPillContentUtils.h +46 -46
  293. package/ios/utils/ListMarkerDrawer.h +15 -15
  294. package/ios/utils/ListMarkerDrawer.m +239 -239
  295. package/ios/utils/MentionBackground.h +26 -26
  296. package/ios/utils/MentionBackground.m +86 -86
  297. package/ios/utils/ParagraphStyleUtils.h +87 -87
  298. package/ios/utils/ParagraphStyleUtils.m +484 -484
  299. package/ios/utils/PasteboardUtils.h +48 -48
  300. package/ios/utils/PasteboardUtils.m +166 -166
  301. package/ios/utils/RTFExportUtils.h +24 -24
  302. package/ios/utils/RTFExportUtils.m +299 -299
  303. package/ios/utils/SelectionColorUtils.h +14 -14
  304. package/ios/utils/StylePropsUtils.h +1340 -1340
  305. package/ios/utils/TaskListTapUtils.h +6 -6
  306. package/ios/utils/TaskListTapUtils.m +14 -14
  307. package/ios/utils/TextViewLayoutManager.h +14 -14
  308. package/ios/utils/TiptapAccessibilityElementBuilder.h +43 -43
  309. package/ios/utils/TiptapAccessibilityElementBuilder.m +432 -432
  310. package/ios/utils/TiptapExtractor.h +17 -17
  311. package/ios/utils/TiptapExtractor.m +367 -367
  312. package/ios/views/ENRMTiptapTextView.h +25 -25
  313. package/ios/views/ENRMTiptapTextView.m +247 -247
  314. package/package.json +65 -70
  315. package/react-native.config.js +10 -10
  316. package/src/admonitionDefaults.ts +58 -58
  317. package/src/darkModeTextStyle.ts +99 -99
  318. package/src/headingDefaults.ts +21 -21
  319. package/src/index.tsx +4 -4
  320. package/src/linkVariantUtils.ts +120 -120
  321. package/src/normalizeTiptapStyle.ts +397 -397
  322. package/src/rn-globals.d.ts +1 -1
  323. package/src/styleUtils.ts +107 -107
  324. package/src/types/TiptapStyle.ts +532 -532
  325. package/src/types/TiptapStyleInternal.ts +299 -299
  326. package/src/types/linkPill.ts +9 -9
  327. package/src/utils/isDev.ts +4 -4
@@ -1,197 +1,197 @@
1
- #import "CodeBackground.h"
2
- #import "ENRMUIKit.h"
3
- #import "RenderContext.h"
4
-
5
- NSString *const CodeAttributeName = @"Code";
6
-
7
- static const CGFloat kCodeBackgroundCornerRadius = 2.0;
8
- static const CGFloat kCodeBackgroundBorderWidth = 0.5;
9
-
10
- @implementation CodeBackground {
11
- StyleConfig *_config;
12
- }
13
-
14
- - (instancetype)initWithConfig:(StyleConfig *)config
15
- {
16
- self = [super init];
17
- if (self) {
18
- _config = config;
19
- }
20
- return self;
21
- }
22
-
23
- - (void)drawBackgroundsForGlyphRange:(NSRange)glyphsToShow
24
- layoutManager:(NSLayoutManager *)layoutManager
25
- textContainer:(NSTextContainer *)textContainer
26
- atPoint:(CGPoint)origin
27
- {
28
- RCTUIColor *backgroundColor = _config.codeBackgroundColor;
29
- if (!backgroundColor)
30
- return;
31
-
32
- NSTextStorage *textStorage = layoutManager.textStorage;
33
- NSRange charRange = [layoutManager characterRangeForGlyphRange:glyphsToShow actualGlyphRange:NULL];
34
- if (charRange.location == NSNotFound || charRange.length == 0)
35
- return;
36
-
37
- [textStorage enumerateAttribute:CodeAttributeName
38
- inRange:NSMakeRange(0, textStorage.length)
39
- options:0
40
- usingBlock:^(id value, NSRange range, BOOL *stop) {
41
- if (!value || range.length == 0)
42
- return;
43
- if (NSIntersectionRange(range, charRange).length == 0)
44
- return;
45
-
46
- [self drawCodeBackgroundForRange:range
47
- layoutManager:layoutManager
48
- textContainer:textContainer
49
- atPoint:origin
50
- backgroundColor:backgroundColor
51
- borderColor:self->_config.codeBorderColor];
52
- }];
53
- }
54
-
55
- - (void)drawCodeBackgroundForRange:(NSRange)range
56
- layoutManager:(NSLayoutManager *)layoutManager
57
- textContainer:(NSTextContainer *)textContainer
58
- atPoint:(CGPoint)origin
59
- backgroundColor:(RCTUIColor *)backgroundColor
60
- borderColor:(RCTUIColor *)borderColor
61
- {
62
- NSRange glyphRange = [layoutManager glyphRangeForCharacterRange:range actualCharacterRange:NULL];
63
- if (glyphRange.location == NSNotFound || glyphRange.length == 0)
64
- return;
65
-
66
- CGFloat referenceHeight = [self findReferenceHeightForRange:range textStorage:layoutManager.textStorage];
67
-
68
- [layoutManager
69
- enumerateLineFragmentsForGlyphRange:glyphRange
70
- usingBlock:^(CGRect rect, CGRect usedRect, NSTextContainer *tc, NSRange lineRange,
71
- BOOL *stop) {
72
- NSRange intersect = NSIntersectionRange(lineRange, glyphRange);
73
- if (intersect.length == 0)
74
- return;
75
-
76
- BOOL isFirst = (intersect.location == glyphRange.location);
77
- BOOL isLast = (NSMaxRange(intersect) == NSMaxRange(glyphRange));
78
-
79
- CGRect finalRect;
80
- if (isFirst || isLast) {
81
- // Precise bounds are only required for the start and end of the span
82
- CGRect textRect = [layoutManager boundingRectForGlyphRange:intersect
83
- inTextContainer:textContainer];
84
- finalRect = CGRectMake(textRect.origin.x + origin.x, textRect.origin.y + origin.y,
85
- textRect.size.width, textRect.size.height);
86
-
87
- // For multi-line, extend the first line to the right edge of the fragment
88
- if (isFirst && !isLast) {
89
- finalRect.size.width =
90
- (usedRect.origin.x + usedRect.size.width + origin.x) - finalRect.origin.x;
91
- }
92
- } else {
93
- // OPTIMIZATION: Middle lines use the usedRect of the fragment directly
94
- finalRect = CGRectMake(usedRect.origin.x + origin.x, usedRect.origin.y + origin.y,
95
- usedRect.size.width, usedRect.size.height);
96
- }
97
-
98
- // Ensure consistent height and no gaps
99
- if (finalRect.size.height < referenceHeight) {
100
- finalRect.size.height = referenceHeight;
101
- }
102
-
103
- [self drawBackgroundAndBorders:finalRect
104
- backgroundColor:backgroundColor
105
- borderColor:borderColor
106
- isFirst:isFirst
107
- isLast:isLast];
108
- }];
109
- }
110
-
111
- #pragma mark - Drawing Logic
112
-
113
- - (void)drawBackgroundAndBorders:(CGRect)rect
114
- backgroundColor:(RCTUIColor *)backgroundColor
115
- borderColor:(RCTUIColor *)borderColor
116
- isFirst:(BOOL)isFirst
117
- isLast:(BOOL)isLast
118
- {
119
- UIBezierPath *path = [self pathForRect:rect isFirst:isFirst isLast:isLast];
120
- [backgroundColor setFill];
121
- [path fill];
122
-
123
- if (borderColor) {
124
- [borderColor setStroke];
125
- UIBezierPath *strokePath =
126
- (isFirst && isLast) ? path : [self openBorderPathForRect:rect isFirst:isFirst isLast:isLast];
127
- strokePath.lineWidth = kCodeBackgroundBorderWidth;
128
- BezierPathSetRoundStyle(strokePath);
129
- [strokePath stroke];
130
- }
131
- }
132
-
133
- - (UIBezierPath *)pathForRect:(CGRect)rect isFirst:(BOOL)isFirst isLast:(BOOL)isLast
134
- {
135
- #if !TARGET_OS_OSX
136
- UIRectCorner corners = 0;
137
- if (isFirst)
138
- corners |= (UIRectCornerTopLeft | UIRectCornerBottomLeft);
139
- if (isLast)
140
- corners |= (UIRectCornerTopRight | UIRectCornerBottomRight);
141
-
142
- return [UIBezierPath bezierPathWithRoundedRect:rect
143
- byRoundingCorners:corners
144
- cornerRadii:CGSizeMake(kCodeBackgroundCornerRadius, kCodeBackgroundCornerRadius)];
145
- #else
146
- // NSBezierPath doesn't support per-corner rounding — use uniform corner radius
147
- CGFloat cornerRadius = (isFirst || isLast) ? kCodeBackgroundCornerRadius : 0;
148
- return UIBezierPathWithRoundedRect(rect, cornerRadius);
149
- #endif
150
- }
151
-
152
- - (UIBezierPath *)openBorderPathForRect:(CGRect)rect isFirst:(BOOL)isFirst isLast:(BOOL)isLast
153
- {
154
- UIBezierPath *path = [UIBezierPath bezierPath];
155
- CGFloat r = kCodeBackgroundCornerRadius;
156
- CGFloat inset = kCodeBackgroundBorderWidth / 2.0;
157
- CGRect insetRect = CGRectInset(rect, inset, inset);
158
-
159
- if (isFirst) {
160
- [path moveToPoint:CGPointMake(CGRectGetMaxX(rect), insetRect.origin.y)];
161
- BezierPathAddLine(path, CGPointMake(insetRect.origin.x + r, insetRect.origin.y));
162
- BezierPathAddQuadCurve(path, CGPointMake(insetRect.origin.x, insetRect.origin.y + r),
163
- CGPointMake(insetRect.origin.x, insetRect.origin.y));
164
- BezierPathAddLine(path, CGPointMake(insetRect.origin.x, CGRectGetMaxY(insetRect) - r));
165
- BezierPathAddQuadCurve(path, CGPointMake(insetRect.origin.x + r, CGRectGetMaxY(insetRect)),
166
- CGPointMake(insetRect.origin.x, CGRectGetMaxY(insetRect)));
167
- BezierPathAddLine(path, CGPointMake(CGRectGetMaxX(rect), CGRectGetMaxY(insetRect)));
168
- } else if (isLast) {
169
- [path moveToPoint:CGPointMake(rect.origin.x, insetRect.origin.y)];
170
- BezierPathAddLine(path, CGPointMake(CGRectGetMaxX(insetRect) - r, insetRect.origin.y));
171
- BezierPathAddQuadCurve(path, CGPointMake(CGRectGetMaxX(insetRect), insetRect.origin.y + r),
172
- CGPointMake(CGRectGetMaxX(insetRect), insetRect.origin.y));
173
- BezierPathAddLine(path, CGPointMake(CGRectGetMaxX(insetRect), CGRectGetMaxY(insetRect) - r));
174
- BezierPathAddQuadCurve(path, CGPointMake(CGRectGetMaxX(insetRect) - r, CGRectGetMaxY(insetRect)),
175
- CGPointMake(CGRectGetMaxX(insetRect), CGRectGetMaxY(insetRect)));
176
- BezierPathAddLine(path, CGPointMake(rect.origin.x, CGRectGetMaxY(insetRect)));
177
- } else {
178
- [path moveToPoint:CGPointMake(rect.origin.x, insetRect.origin.y)];
179
- BezierPathAddLine(path, CGPointMake(CGRectGetMaxX(rect), insetRect.origin.y));
180
- [path moveToPoint:CGPointMake(rect.origin.x, CGRectGetMaxY(insetRect))];
181
- BezierPathAddLine(path, CGPointMake(CGRectGetMaxX(rect), CGRectGetMaxY(insetRect)));
182
- }
183
- return path;
184
- }
185
-
186
- #pragma mark - Helpers
187
-
188
- - (CGFloat)findReferenceHeightForRange:(NSRange)range textStorage:(NSTextStorage *)textStorage
189
- {
190
- if (range.location == NSNotFound || range.length == 0 || !textStorage) {
191
- return [_config paragraphFontSize] * 1.2;
192
- }
193
- NSNumber *lineHeightValue = [textStorage attribute:@"BlockLineHeight" atIndex:range.location effectiveRange:NULL];
194
- return lineHeightValue ? [lineHeightValue doubleValue] : ([_config paragraphFontSize] * 1.2);
195
- }
196
-
1
+ #import "CodeBackground.h"
2
+ #import "ENRMUIKit.h"
3
+ #import "RenderContext.h"
4
+
5
+ NSString *const CodeAttributeName = @"Code";
6
+
7
+ static const CGFloat kCodeBackgroundCornerRadius = 2.0;
8
+ static const CGFloat kCodeBackgroundBorderWidth = 0.5;
9
+
10
+ @implementation CodeBackground {
11
+ StyleConfig *_config;
12
+ }
13
+
14
+ - (instancetype)initWithConfig:(StyleConfig *)config
15
+ {
16
+ self = [super init];
17
+ if (self) {
18
+ _config = config;
19
+ }
20
+ return self;
21
+ }
22
+
23
+ - (void)drawBackgroundsForGlyphRange:(NSRange)glyphsToShow
24
+ layoutManager:(NSLayoutManager *)layoutManager
25
+ textContainer:(NSTextContainer *)textContainer
26
+ atPoint:(CGPoint)origin
27
+ {
28
+ RCTUIColor *backgroundColor = _config.codeBackgroundColor;
29
+ if (!backgroundColor)
30
+ return;
31
+
32
+ NSTextStorage *textStorage = layoutManager.textStorage;
33
+ NSRange charRange = [layoutManager characterRangeForGlyphRange:glyphsToShow actualGlyphRange:NULL];
34
+ if (charRange.location == NSNotFound || charRange.length == 0)
35
+ return;
36
+
37
+ [textStorage enumerateAttribute:CodeAttributeName
38
+ inRange:NSMakeRange(0, textStorage.length)
39
+ options:0
40
+ usingBlock:^(id value, NSRange range, BOOL *stop) {
41
+ if (!value || range.length == 0)
42
+ return;
43
+ if (NSIntersectionRange(range, charRange).length == 0)
44
+ return;
45
+
46
+ [self drawCodeBackgroundForRange:range
47
+ layoutManager:layoutManager
48
+ textContainer:textContainer
49
+ atPoint:origin
50
+ backgroundColor:backgroundColor
51
+ borderColor:self->_config.codeBorderColor];
52
+ }];
53
+ }
54
+
55
+ - (void)drawCodeBackgroundForRange:(NSRange)range
56
+ layoutManager:(NSLayoutManager *)layoutManager
57
+ textContainer:(NSTextContainer *)textContainer
58
+ atPoint:(CGPoint)origin
59
+ backgroundColor:(RCTUIColor *)backgroundColor
60
+ borderColor:(RCTUIColor *)borderColor
61
+ {
62
+ NSRange glyphRange = [layoutManager glyphRangeForCharacterRange:range actualCharacterRange:NULL];
63
+ if (glyphRange.location == NSNotFound || glyphRange.length == 0)
64
+ return;
65
+
66
+ CGFloat referenceHeight = [self findReferenceHeightForRange:range textStorage:layoutManager.textStorage];
67
+
68
+ [layoutManager
69
+ enumerateLineFragmentsForGlyphRange:glyphRange
70
+ usingBlock:^(CGRect rect, CGRect usedRect, NSTextContainer *tc, NSRange lineRange,
71
+ BOOL *stop) {
72
+ NSRange intersect = NSIntersectionRange(lineRange, glyphRange);
73
+ if (intersect.length == 0)
74
+ return;
75
+
76
+ BOOL isFirst = (intersect.location == glyphRange.location);
77
+ BOOL isLast = (NSMaxRange(intersect) == NSMaxRange(glyphRange));
78
+
79
+ CGRect finalRect;
80
+ if (isFirst || isLast) {
81
+ // Precise bounds are only required for the start and end of the span
82
+ CGRect textRect = [layoutManager boundingRectForGlyphRange:intersect
83
+ inTextContainer:textContainer];
84
+ finalRect = CGRectMake(textRect.origin.x + origin.x, textRect.origin.y + origin.y,
85
+ textRect.size.width, textRect.size.height);
86
+
87
+ // For multi-line, extend the first line to the right edge of the fragment
88
+ if (isFirst && !isLast) {
89
+ finalRect.size.width =
90
+ (usedRect.origin.x + usedRect.size.width + origin.x) - finalRect.origin.x;
91
+ }
92
+ } else {
93
+ // OPTIMIZATION: Middle lines use the usedRect of the fragment directly
94
+ finalRect = CGRectMake(usedRect.origin.x + origin.x, usedRect.origin.y + origin.y,
95
+ usedRect.size.width, usedRect.size.height);
96
+ }
97
+
98
+ // Ensure consistent height and no gaps
99
+ if (finalRect.size.height < referenceHeight) {
100
+ finalRect.size.height = referenceHeight;
101
+ }
102
+
103
+ [self drawBackgroundAndBorders:finalRect
104
+ backgroundColor:backgroundColor
105
+ borderColor:borderColor
106
+ isFirst:isFirst
107
+ isLast:isLast];
108
+ }];
109
+ }
110
+
111
+ #pragma mark - Drawing Logic
112
+
113
+ - (void)drawBackgroundAndBorders:(CGRect)rect
114
+ backgroundColor:(RCTUIColor *)backgroundColor
115
+ borderColor:(RCTUIColor *)borderColor
116
+ isFirst:(BOOL)isFirst
117
+ isLast:(BOOL)isLast
118
+ {
119
+ UIBezierPath *path = [self pathForRect:rect isFirst:isFirst isLast:isLast];
120
+ [backgroundColor setFill];
121
+ [path fill];
122
+
123
+ if (borderColor) {
124
+ [borderColor setStroke];
125
+ UIBezierPath *strokePath =
126
+ (isFirst && isLast) ? path : [self openBorderPathForRect:rect isFirst:isFirst isLast:isLast];
127
+ strokePath.lineWidth = kCodeBackgroundBorderWidth;
128
+ BezierPathSetRoundStyle(strokePath);
129
+ [strokePath stroke];
130
+ }
131
+ }
132
+
133
+ - (UIBezierPath *)pathForRect:(CGRect)rect isFirst:(BOOL)isFirst isLast:(BOOL)isLast
134
+ {
135
+ #if !TARGET_OS_OSX
136
+ UIRectCorner corners = 0;
137
+ if (isFirst)
138
+ corners |= (UIRectCornerTopLeft | UIRectCornerBottomLeft);
139
+ if (isLast)
140
+ corners |= (UIRectCornerTopRight | UIRectCornerBottomRight);
141
+
142
+ return [UIBezierPath bezierPathWithRoundedRect:rect
143
+ byRoundingCorners:corners
144
+ cornerRadii:CGSizeMake(kCodeBackgroundCornerRadius, kCodeBackgroundCornerRadius)];
145
+ #else
146
+ // NSBezierPath doesn't support per-corner rounding — use uniform corner radius
147
+ CGFloat cornerRadius = (isFirst || isLast) ? kCodeBackgroundCornerRadius : 0;
148
+ return UIBezierPathWithRoundedRect(rect, cornerRadius);
149
+ #endif
150
+ }
151
+
152
+ - (UIBezierPath *)openBorderPathForRect:(CGRect)rect isFirst:(BOOL)isFirst isLast:(BOOL)isLast
153
+ {
154
+ UIBezierPath *path = [UIBezierPath bezierPath];
155
+ CGFloat r = kCodeBackgroundCornerRadius;
156
+ CGFloat inset = kCodeBackgroundBorderWidth / 2.0;
157
+ CGRect insetRect = CGRectInset(rect, inset, inset);
158
+
159
+ if (isFirst) {
160
+ [path moveToPoint:CGPointMake(CGRectGetMaxX(rect), insetRect.origin.y)];
161
+ BezierPathAddLine(path, CGPointMake(insetRect.origin.x + r, insetRect.origin.y));
162
+ BezierPathAddQuadCurve(path, CGPointMake(insetRect.origin.x, insetRect.origin.y + r),
163
+ CGPointMake(insetRect.origin.x, insetRect.origin.y));
164
+ BezierPathAddLine(path, CGPointMake(insetRect.origin.x, CGRectGetMaxY(insetRect) - r));
165
+ BezierPathAddQuadCurve(path, CGPointMake(insetRect.origin.x + r, CGRectGetMaxY(insetRect)),
166
+ CGPointMake(insetRect.origin.x, CGRectGetMaxY(insetRect)));
167
+ BezierPathAddLine(path, CGPointMake(CGRectGetMaxX(rect), CGRectGetMaxY(insetRect)));
168
+ } else if (isLast) {
169
+ [path moveToPoint:CGPointMake(rect.origin.x, insetRect.origin.y)];
170
+ BezierPathAddLine(path, CGPointMake(CGRectGetMaxX(insetRect) - r, insetRect.origin.y));
171
+ BezierPathAddQuadCurve(path, CGPointMake(CGRectGetMaxX(insetRect), insetRect.origin.y + r),
172
+ CGPointMake(CGRectGetMaxX(insetRect), insetRect.origin.y));
173
+ BezierPathAddLine(path, CGPointMake(CGRectGetMaxX(insetRect), CGRectGetMaxY(insetRect) - r));
174
+ BezierPathAddQuadCurve(path, CGPointMake(CGRectGetMaxX(insetRect) - r, CGRectGetMaxY(insetRect)),
175
+ CGPointMake(CGRectGetMaxX(insetRect), CGRectGetMaxY(insetRect)));
176
+ BezierPathAddLine(path, CGPointMake(rect.origin.x, CGRectGetMaxY(insetRect)));
177
+ } else {
178
+ [path moveToPoint:CGPointMake(rect.origin.x, insetRect.origin.y)];
179
+ BezierPathAddLine(path, CGPointMake(CGRectGetMaxX(rect), insetRect.origin.y));
180
+ [path moveToPoint:CGPointMake(rect.origin.x, CGRectGetMaxY(insetRect))];
181
+ BezierPathAddLine(path, CGPointMake(CGRectGetMaxX(rect), CGRectGetMaxY(insetRect)));
182
+ }
183
+ return path;
184
+ }
185
+
186
+ #pragma mark - Helpers
187
+
188
+ - (CGFloat)findReferenceHeightForRange:(NSRange)range textStorage:(NSTextStorage *)textStorage
189
+ {
190
+ if (range.location == NSNotFound || range.length == 0 || !textStorage) {
191
+ return [_config paragraphFontSize] * 1.2;
192
+ }
193
+ NSNumber *lineHeightValue = [textStorage attribute:@"BlockLineHeight" atIndex:range.location effectiveRange:NULL];
194
+ return lineHeightValue ? [lineHeightValue doubleValue] : ([_config paragraphFontSize] * 1.2);
195
+ }
196
+
197
197
  @end
@@ -1,17 +1,17 @@
1
- #pragma once
2
- #import "ENRMUIKit.h"
3
- #import "StyleConfig.h"
4
-
5
- NS_ASSUME_NONNULL_BEGIN
6
-
7
- @interface CodeBlockBackground : NSObject
8
-
9
- - (instancetype)initWithConfig:(StyleConfig *)config;
10
- - (void)drawBackgroundsForGlyphRange:(NSRange)glyphsToShow
11
- layoutManager:(NSLayoutManager *)layoutManager
12
- textContainer:(NSTextContainer *)textContainer
13
- atPoint:(CGPoint)origin;
14
-
15
- @end
16
-
17
- NS_ASSUME_NONNULL_END
1
+ #pragma once
2
+ #import "ENRMUIKit.h"
3
+ #import "StyleConfig.h"
4
+
5
+ NS_ASSUME_NONNULL_BEGIN
6
+
7
+ @interface CodeBlockBackground : NSObject
8
+
9
+ - (instancetype)initWithConfig:(StyleConfig *)config;
10
+ - (void)drawBackgroundsForGlyphRange:(NSRange)glyphsToShow
11
+ layoutManager:(NSLayoutManager *)layoutManager
12
+ textContainer:(NSTextContainer *)textContainer
13
+ atPoint:(CGPoint)origin;
14
+
15
+ @end
16
+
17
+ NS_ASSUME_NONNULL_END
@@ -1,103 +1,103 @@
1
- #import "CodeBlockBackground.h"
2
- #import "ENRMUIKit.h"
3
- #import "LastElementUtils.h"
4
- #import "StyleConfig.h"
5
-
6
- // Draws the commonmark-flavor code block box behind the text view's glyph
7
- // runs. The visual conventions (half-stroke border inset, corner radius
8
- // handling) must stay in sync with the whole-rect box the github flavor
9
- // draws in ENRMCodeBlockContainerView's drawRect:.
10
-
11
- @implementation CodeBlockBackground {
12
- StyleConfig *_config;
13
- }
14
-
15
- - (instancetype)initWithConfig:(StyleConfig *)config
16
- {
17
- if (self = [super init]) {
18
- _config = config;
19
- }
20
- return self;
21
- }
22
-
23
- - (void)drawBackgroundsForGlyphRange:(NSRange)glyphsToShow
24
- layoutManager:(NSLayoutManager *)layoutManager
25
- textContainer:(NSTextContainer *)textContainer
26
- atPoint:(CGPoint)origin
27
- {
28
- NSTextStorage *textStorage = layoutManager.textStorage;
29
- NSRange charRange = [layoutManager characterRangeForGlyphRange:glyphsToShow actualGlyphRange:NULL];
30
-
31
- // Enumerate over the full storage range so each code block's full rect is drawn.
32
- // Restricting to charRange causes partial rects per draw pass, which produces
33
- // multiple stacked oval shapes when border radius is large.
34
- // The graphics context clip ensures only the visible portion is painted.
35
- [textStorage enumerateAttribute:CodeBlockAttributeName
36
- inRange:NSMakeRange(0, textStorage.length)
37
- options:0
38
- usingBlock:^(id value, NSRange range, BOOL *stop) {
39
- if (!value)
40
- return;
41
- if (NSIntersectionRange(range, charRange).length == 0)
42
- return;
43
- [self drawCodeBlockBackgroundForRange:range
44
- layoutManager:layoutManager
45
- textContainer:textContainer
46
- atPoint:origin];
47
- }];
48
- }
49
-
50
- - (void)drawCodeBlockBackgroundForRange:(NSRange)range
51
- layoutManager:(NSLayoutManager *)layoutManager
52
- textContainer:(NSTextContainer *)textContainer
53
- atPoint:(CGPoint)origin
54
- {
55
- NSRange glyphRange = [layoutManager glyphRangeForCharacterRange:range actualCharacterRange:NULL];
56
- CGRect blockRect = [layoutManager boundingRectForGlyphRange:glyphRange inTextContainer:textContainer];
57
-
58
- if (CGRectIsEmpty(blockRect))
59
- return;
60
-
61
- NSNumber *indentAttr = [layoutManager.textStorage attribute:CodeBlockIndentAttributeName
62
- atIndex:range.location
63
- effectiveRange:NULL];
64
- CGFloat indent = [indentAttr doubleValue];
65
-
66
- CGFloat availableWidth = textContainer.size.width - indent;
67
- if (availableWidth <= 0)
68
- return;
69
-
70
- blockRect.origin.x = origin.x + indent;
71
- blockRect.origin.y += origin.y;
72
- blockRect.size.width = availableWidth;
73
-
74
- // We extend the background specifically to cover the bottom padding spacer,
75
- // excluding any additional marginBottom applied via measurement.
76
- BOOL isLastCodeBlock = (NSMaxRange(range) == layoutManager.textStorage.length);
77
- if (isLastCodeBlock) {
78
- blockRect.size.height += [_config codeBlockPadding];
79
- }
80
-
81
- CGFloat borderWidth = [_config codeBlockBorderWidth];
82
- CGFloat borderRadius = [_config codeBlockBorderRadius];
83
- CGFloat inset = borderWidth / 2.0;
84
-
85
- CGRect insetRect = CGRectInset(blockRect, inset, inset);
86
- UIBezierPath *path = UIBezierPathWithRoundedRect(insetRect, MAX(0, borderRadius - inset));
87
-
88
- CGContextRef ctx = UIGraphicsGetCurrentContext();
89
- CGContextSaveGState(ctx);
90
- {
91
- [[_config codeBlockBackgroundColor] setFill];
92
- [path fill];
93
-
94
- if (borderWidth > 0) {
95
- [[_config codeBlockBorderColor] setStroke];
96
- path.lineWidth = borderWidth;
97
- BezierPathSetRoundStyle(path);
98
- [path stroke];
99
- }
100
- }
101
- CGContextRestoreGState(ctx);
102
- }
1
+ #import "CodeBlockBackground.h"
2
+ #import "ENRMUIKit.h"
3
+ #import "LastElementUtils.h"
4
+ #import "StyleConfig.h"
5
+
6
+ // Draws the commonmark-flavor code block box behind the text view's glyph
7
+ // runs. The visual conventions (half-stroke border inset, corner radius
8
+ // handling) must stay in sync with the whole-rect box the github flavor
9
+ // draws in ENRMCodeBlockContainerView's drawRect:.
10
+
11
+ @implementation CodeBlockBackground {
12
+ StyleConfig *_config;
13
+ }
14
+
15
+ - (instancetype)initWithConfig:(StyleConfig *)config
16
+ {
17
+ if (self = [super init]) {
18
+ _config = config;
19
+ }
20
+ return self;
21
+ }
22
+
23
+ - (void)drawBackgroundsForGlyphRange:(NSRange)glyphsToShow
24
+ layoutManager:(NSLayoutManager *)layoutManager
25
+ textContainer:(NSTextContainer *)textContainer
26
+ atPoint:(CGPoint)origin
27
+ {
28
+ NSTextStorage *textStorage = layoutManager.textStorage;
29
+ NSRange charRange = [layoutManager characterRangeForGlyphRange:glyphsToShow actualGlyphRange:NULL];
30
+
31
+ // Enumerate over the full storage range so each code block's full rect is drawn.
32
+ // Restricting to charRange causes partial rects per draw pass, which produces
33
+ // multiple stacked oval shapes when border radius is large.
34
+ // The graphics context clip ensures only the visible portion is painted.
35
+ [textStorage enumerateAttribute:CodeBlockAttributeName
36
+ inRange:NSMakeRange(0, textStorage.length)
37
+ options:0
38
+ usingBlock:^(id value, NSRange range, BOOL *stop) {
39
+ if (!value)
40
+ return;
41
+ if (NSIntersectionRange(range, charRange).length == 0)
42
+ return;
43
+ [self drawCodeBlockBackgroundForRange:range
44
+ layoutManager:layoutManager
45
+ textContainer:textContainer
46
+ atPoint:origin];
47
+ }];
48
+ }
49
+
50
+ - (void)drawCodeBlockBackgroundForRange:(NSRange)range
51
+ layoutManager:(NSLayoutManager *)layoutManager
52
+ textContainer:(NSTextContainer *)textContainer
53
+ atPoint:(CGPoint)origin
54
+ {
55
+ NSRange glyphRange = [layoutManager glyphRangeForCharacterRange:range actualCharacterRange:NULL];
56
+ CGRect blockRect = [layoutManager boundingRectForGlyphRange:glyphRange inTextContainer:textContainer];
57
+
58
+ if (CGRectIsEmpty(blockRect))
59
+ return;
60
+
61
+ NSNumber *indentAttr = [layoutManager.textStorage attribute:CodeBlockIndentAttributeName
62
+ atIndex:range.location
63
+ effectiveRange:NULL];
64
+ CGFloat indent = [indentAttr doubleValue];
65
+
66
+ CGFloat availableWidth = textContainer.size.width - indent;
67
+ if (availableWidth <= 0)
68
+ return;
69
+
70
+ blockRect.origin.x = origin.x + indent;
71
+ blockRect.origin.y += origin.y;
72
+ blockRect.size.width = availableWidth;
73
+
74
+ // We extend the background specifically to cover the bottom padding spacer,
75
+ // excluding any additional marginBottom applied via measurement.
76
+ BOOL isLastCodeBlock = (NSMaxRange(range) == layoutManager.textStorage.length);
77
+ if (isLastCodeBlock) {
78
+ blockRect.size.height += [_config codeBlockPadding];
79
+ }
80
+
81
+ CGFloat borderWidth = [_config codeBlockBorderWidth];
82
+ CGFloat borderRadius = [_config codeBlockBorderRadius];
83
+ CGFloat inset = borderWidth / 2.0;
84
+
85
+ CGRect insetRect = CGRectInset(blockRect, inset, inset);
86
+ UIBezierPath *path = UIBezierPathWithRoundedRect(insetRect, MAX(0, borderRadius - inset));
87
+
88
+ CGContextRef ctx = UIGraphicsGetCurrentContext();
89
+ CGContextSaveGState(ctx);
90
+ {
91
+ [[_config codeBlockBackgroundColor] setFill];
92
+ [path fill];
93
+
94
+ if (borderWidth > 0) {
95
+ [[_config codeBlockBorderColor] setStroke];
96
+ path.lineWidth = borderWidth;
97
+ BezierPathSetRoundStyle(path);
98
+ [path stroke];
99
+ }
100
+ }
101
+ CGContextRestoreGState(ctx);
102
+ }
103
103
  @end