react-native-enriched-markdown-scaffold 0.7.4-scaffold.9 → 1.0.2-scaffold.10

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (505) hide show
  1. package/README.md +54 -8
  2. package/ReactNativeEnrichedMarkdown.podspec +82 -73
  3. package/android/build.gradle +188 -1
  4. package/android/consumer-rules.pro +1 -1
  5. package/android/generated/java/com/facebook/react/viewmanagers/EnrichedMarkdownManagerDelegate.java +27 -0
  6. package/android/generated/java/com/facebook/react/viewmanagers/EnrichedMarkdownManagerInterface.java +7 -0
  7. package/android/generated/java/com/facebook/react/viewmanagers/EnrichedMarkdownTextInputManagerDelegate.java +24 -0
  8. package/android/generated/java/com/facebook/react/viewmanagers/EnrichedMarkdownTextInputManagerInterface.java +8 -0
  9. package/android/generated/java/com/facebook/react/viewmanagers/EnrichedMarkdownTextManagerDelegate.java +27 -0
  10. package/android/generated/java/com/facebook/react/viewmanagers/EnrichedMarkdownTextManagerInterface.java +7 -0
  11. package/android/generated/jni/react/renderer/components/EnrichedMarkdownTextSpec/EventEmitters.cpp +223 -0
  12. package/android/generated/jni/react/renderer/components/EnrichedMarkdownTextSpec/EventEmitters.h +183 -0
  13. package/android/generated/jni/react/renderer/components/EnrichedMarkdownTextSpec/Props.cpp +65 -0
  14. package/android/generated/jni/react/renderer/components/EnrichedMarkdownTextSpec/Props.h +1086 -61
  15. package/android/src/main/baseline-prof.txt +1 -1
  16. package/android/src/main/cpp/jni-adapter.cpp +74 -0
  17. package/android/src/main/java/com/swmansion/enriched/markdown/EnrichedMarkdown.kt +351 -13
  18. package/android/src/main/java/com/swmansion/enriched/markdown/EnrichedMarkdownInternalText.kt +62 -0
  19. package/android/src/main/java/com/swmansion/enriched/markdown/EnrichedMarkdownManager.kt +85 -0
  20. package/android/src/main/java/com/swmansion/enriched/markdown/EnrichedMarkdownText.kt +160 -1
  21. package/android/src/main/java/com/swmansion/enriched/markdown/EnrichedMarkdownTextLayoutManager.kt +10 -1
  22. package/android/src/main/java/com/swmansion/enriched/markdown/EnrichedMarkdownTextManager.kt +76 -0
  23. package/android/src/main/java/com/swmansion/enriched/markdown/MeasurementStore.kt +126 -10
  24. package/android/src/main/java/com/swmansion/enriched/markdown/events/CopyPressEvent.kt +24 -0
  25. package/android/src/main/java/com/swmansion/enriched/markdown/events/CopyRequestEvent.kt +28 -0
  26. package/android/src/main/java/com/swmansion/enriched/markdown/events/LinkLayoutEvent.kt +36 -0
  27. package/android/src/main/java/com/swmansion/enriched/markdown/events/SelectionChangeEvent.kt +43 -0
  28. package/android/src/main/java/com/swmansion/enriched/markdown/input/EnrichedMarkdownTextInputManager.kt +54 -4
  29. package/android/src/main/java/com/swmansion/enriched/markdown/input/EnrichedMarkdownTextInputView.kt +923 -462
  30. package/android/src/main/java/com/swmansion/enriched/markdown/input/MarkdownClipboard.kt +42 -0
  31. package/android/src/main/java/com/swmansion/enriched/markdown/input/editing/BlockEditCoordinator.kt +196 -0
  32. package/android/src/main/java/com/swmansion/enriched/markdown/input/editing/ClipboardCoordinator.kt +73 -0
  33. package/android/src/main/java/com/swmansion/enriched/markdown/input/editing/EditContext.kt +19 -0
  34. package/android/src/main/java/com/swmansion/enriched/markdown/input/editing/EditPipeline.kt +248 -0
  35. package/android/src/main/java/com/swmansion/enriched/markdown/input/editing/EditSession.kt +52 -0
  36. package/android/src/main/java/com/swmansion/enriched/markdown/input/editing/InputConnectionWrapper.kt +108 -7
  37. package/android/src/main/java/com/swmansion/enriched/markdown/input/editing/LinkCoordinator.kt +69 -0
  38. package/android/src/main/java/com/swmansion/enriched/markdown/input/editing/MarkdownTextWatcher.kt +3 -3
  39. package/android/src/main/java/com/swmansion/enriched/markdown/input/editing/MentionCoordinator.kt +118 -0
  40. package/android/src/main/java/com/swmansion/enriched/markdown/input/events/OnChangeStateEvent.kt +26 -0
  41. package/android/src/main/java/com/swmansion/enriched/markdown/input/events/OnContextMenuItemPressEvent.kt +26 -0
  42. package/android/src/main/java/com/swmansion/enriched/markdown/input/events/OnInputKeyPressEvent.kt +24 -0
  43. package/android/src/main/java/com/swmansion/enriched/markdown/input/events/OnPasteEvent.kt +24 -0
  44. package/android/src/main/java/com/swmansion/enriched/markdown/input/formatting/BlockStore.kt +254 -0
  45. package/android/src/main/java/com/swmansion/enriched/markdown/input/formatting/FormattingStore.kt +80 -87
  46. package/android/src/main/java/com/swmansion/enriched/markdown/input/formatting/InputFormatter.kt +109 -1
  47. package/android/src/main/java/com/swmansion/enriched/markdown/input/formatting/InputParser.kt +116 -22
  48. package/android/src/main/java/com/swmansion/enriched/markdown/input/formatting/MarkdownSerializer.kt +167 -38
  49. package/android/src/main/java/com/swmansion/enriched/markdown/input/formatting/RangeEditAdjustment.kt +149 -0
  50. package/android/src/main/java/com/swmansion/enriched/markdown/input/layout/InputEventEmitter.kt +66 -5
  51. package/android/src/main/java/com/swmansion/enriched/markdown/input/layout/InputMeasurementStore.kt +4 -2
  52. package/android/src/main/java/com/swmansion/enriched/markdown/input/model/BlockRange.kt +27 -0
  53. package/android/src/main/java/com/swmansion/enriched/markdown/input/model/BlockType.kt +48 -0
  54. package/android/src/main/java/com/swmansion/enriched/markdown/input/model/FormattingRange.kt +9 -4
  55. package/android/src/main/java/com/swmansion/enriched/markdown/input/model/InputFormatterStyle.kt +39 -2
  56. package/android/src/main/java/com/swmansion/enriched/markdown/input/model/MathAtom.kt +20 -0
  57. package/android/src/main/java/com/swmansion/enriched/markdown/input/model/MathChipStyle.kt +1 -1
  58. package/android/src/main/java/com/swmansion/enriched/markdown/input/model/MutableRangeBounds.kt +11 -0
  59. package/android/src/main/java/com/swmansion/enriched/markdown/input/spans/InputBulletSpan.kt +82 -0
  60. package/android/src/main/java/com/swmansion/enriched/markdown/input/spans/InputHeadingSpan.kt +58 -0
  61. package/android/src/main/java/com/swmansion/enriched/markdown/input/spans/InputListItemSpacingSpan.kt +37 -0
  62. package/android/src/main/java/com/swmansion/enriched/markdown/input/spans/InputOrderedListMarkerSpan.kt +63 -0
  63. package/android/src/main/java/com/swmansion/enriched/markdown/input/styles/BlockHandler.kt +54 -0
  64. package/android/src/main/java/com/swmansion/enriched/markdown/input/styles/HeadingBlockHandler.kt +27 -0
  65. package/android/src/main/java/com/swmansion/enriched/markdown/input/styles/OrderedListBlockHandler.kt +38 -0
  66. package/android/src/main/java/com/swmansion/enriched/markdown/input/styles/UnorderedListBlockHandler.kt +37 -0
  67. package/android/src/main/java/com/swmansion/enriched/markdown/input/toolbar/InputContextMenu.kt +8 -26
  68. package/android/src/main/java/com/swmansion/enriched/markdown/parser/MarkdownASTNode.kt +1 -0
  69. package/android/src/main/java/com/swmansion/enriched/markdown/parser/Parser.kt +1 -0
  70. package/android/src/main/java/com/swmansion/enriched/markdown/renderer/BlockStyleContext.kt +9 -2
  71. package/android/src/main/java/com/swmansion/enriched/markdown/renderer/BlockquoteRenderer.kt +100 -12
  72. package/android/src/main/java/com/swmansion/enriched/markdown/renderer/CodeBlockRenderer.kt +16 -1
  73. package/android/src/main/java/com/swmansion/enriched/markdown/renderer/HeadingRenderer.kt +4 -0
  74. package/android/src/main/java/com/swmansion/enriched/markdown/renderer/LinkRenderer.kt +37 -7
  75. package/android/src/main/java/com/swmansion/enriched/markdown/renderer/ListContextManager.kt +2 -1
  76. package/android/src/main/java/com/swmansion/enriched/markdown/renderer/ListItemRenderer.kt +74 -18
  77. package/android/src/main/java/com/swmansion/enriched/markdown/renderer/ListRenderer.kt +43 -4
  78. package/android/src/main/java/com/swmansion/enriched/markdown/renderer/NodeRenderer.kt +9 -1
  79. package/android/src/main/java/com/swmansion/enriched/markdown/renderer/SoftBreakRenderer.kt +16 -0
  80. package/android/src/main/java/com/swmansion/enriched/markdown/renderer/SpanStyleCache.kt +35 -28
  81. package/android/src/main/java/com/swmansion/enriched/markdown/spans/BaseListSpan.kt +24 -0
  82. package/android/src/main/java/com/swmansion/enriched/markdown/spans/BlockquoteSpan.kt +174 -24
  83. package/android/src/main/java/com/swmansion/enriched/markdown/spans/CodeBackgroundSpan.kt +20 -82
  84. package/android/src/main/java/com/swmansion/enriched/markdown/spans/CodeBlockSpan.kt +13 -16
  85. package/android/src/main/java/com/swmansion/enriched/markdown/spans/CodeSpan.kt +1 -1
  86. package/android/src/main/java/com/swmansion/enriched/markdown/spans/EmphasisSpan.kt +1 -1
  87. package/android/src/main/java/com/swmansion/enriched/markdown/spans/ImageSpan.kt +182 -46
  88. package/android/src/main/java/com/swmansion/enriched/markdown/spans/InlineChipPainter.kt +140 -0
  89. package/android/src/main/java/com/swmansion/enriched/markdown/spans/LinkChipSpans.kt +177 -0
  90. package/android/src/main/java/com/swmansion/enriched/markdown/spans/LinkSpan.kt +1 -6
  91. package/android/src/main/java/com/swmansion/enriched/markdown/spans/ListItemSpacingSpan.kt +33 -0
  92. package/android/src/main/java/com/swmansion/enriched/markdown/spans/ListMarkerAnchorSpan.kt +38 -0
  93. package/android/src/main/java/com/swmansion/enriched/markdown/spans/OrderedListSpan.kt +2 -0
  94. package/android/src/main/java/com/swmansion/enriched/markdown/spans/StrongSpan.kt +1 -1
  95. package/android/src/main/java/com/swmansion/enriched/markdown/spans/TaskListSpan.kt +3 -2
  96. package/android/src/main/java/com/swmansion/enriched/markdown/spans/UnorderedListSpan.kt +3 -2
  97. package/android/src/main/java/com/swmansion/enriched/markdown/styles/BlockquoteStyle.kt +6 -0
  98. package/android/src/main/java/com/swmansion/enriched/markdown/styles/CodeBlockStyle.kt +26 -0
  99. package/android/src/main/java/com/swmansion/enriched/markdown/styles/ImageStyle.kt +7 -1
  100. package/android/src/main/java/com/swmansion/enriched/markdown/styles/InlineMathStyle.kt +16 -1
  101. package/android/src/main/java/com/swmansion/enriched/markdown/styles/LinkStyle.kt +36 -1
  102. package/android/src/main/java/com/swmansion/enriched/markdown/styles/LinkVariantEntry.kt +7 -3
  103. package/android/src/main/java/com/swmansion/enriched/markdown/styles/ListStyle.kt +4 -1
  104. package/android/src/main/java/com/swmansion/enriched/markdown/styles/MathStyle.kt +3 -0
  105. package/android/src/main/java/com/swmansion/enriched/markdown/styles/StyleConfig.kt +13 -4
  106. package/android/src/main/java/com/swmansion/enriched/markdown/styles/TableStyle.kt +6 -0
  107. package/android/src/main/java/com/swmansion/enriched/markdown/utils/common/CodeBlockHighlighter.kt +90 -0
  108. package/android/src/main/java/com/swmansion/enriched/markdown/utils/common/CodeBlockNode.kt +57 -0
  109. package/android/src/main/java/com/swmansion/enriched/markdown/utils/common/FeatureFlags.kt +1 -0
  110. package/android/src/main/java/com/swmansion/enriched/markdown/utils/common/MarkdownSegment.kt +9 -0
  111. package/android/src/main/java/com/swmansion/enriched/markdown/utils/common/MarkdownViewManagerUtils.kt +84 -7
  112. package/android/src/main/java/com/swmansion/enriched/markdown/utils/common/ReadableMapExtensions.kt +3 -0
  113. package/android/src/main/java/com/swmansion/enriched/markdown/utils/common/RenderedSegment.kt +10 -0
  114. package/android/src/main/java/com/swmansion/enriched/markdown/utils/common/SegmentSignature.kt +1 -0
  115. package/android/src/main/java/com/swmansion/enriched/markdown/utils/common/StreamingMarkdownFilter.kt +83 -5
  116. package/android/src/main/java/com/swmansion/enriched/markdown/utils/common/serialization/MarkdownASTSerializer.kt +4 -0
  117. package/android/src/main/java/com/swmansion/enriched/markdown/utils/input/MarkdownStyleParser.kt +74 -44
  118. package/android/src/main/java/com/swmansion/enriched/markdown/utils/input/PasteTextUtils.kt +52 -0
  119. package/android/src/main/java/com/swmansion/enriched/markdown/utils/text/ImageCache.kt +26 -3
  120. package/android/src/main/java/com/swmansion/enriched/markdown/utils/text/ImageDownloader.kt +22 -9
  121. package/android/src/main/java/com/swmansion/enriched/markdown/utils/text/LocalImageLoader.kt +161 -0
  122. package/android/src/main/java/com/swmansion/enriched/markdown/utils/text/conversion/HTMLGenerator.kt +2 -1
  123. package/android/src/main/java/com/swmansion/enriched/markdown/utils/text/conversion/MarkdownExtractor.kt +6 -0
  124. package/android/src/main/java/com/swmansion/enriched/markdown/utils/text/extensions/TextPaintExtensions.kt +23 -0
  125. package/android/src/main/java/com/swmansion/enriched/markdown/utils/text/interaction/CheckboxTouchHelper.kt +7 -0
  126. package/android/src/main/java/com/swmansion/enriched/markdown/utils/text/interaction/TaskListTapUtils.kt +41 -21
  127. package/android/src/main/java/com/swmansion/enriched/markdown/utils/text/span/BlockSpacing.kt +15 -8
  128. package/android/src/main/java/com/swmansion/enriched/markdown/utils/text/view/HeadlessActionMode.kt +88 -0
  129. package/android/src/main/java/com/swmansion/enriched/markdown/utils/text/view/LinkLayoutCollector.kt +100 -0
  130. package/android/src/main/java/com/swmansion/enriched/markdown/utils/text/view/LinkLongPressMovementMethod.kt +58 -27
  131. package/android/src/main/java/com/swmansion/enriched/markdown/utils/text/view/SelectionActionMode.kt +72 -16
  132. package/android/src/main/java/com/swmansion/enriched/markdown/utils/text/view/SelectionChangeReporter.kt +232 -0
  133. package/android/src/main/java/com/swmansion/enriched/markdown/views/BlockMenuOptions.kt +64 -0
  134. package/android/src/main/java/com/swmansion/enriched/markdown/views/CodeBlockContainerView.kt +414 -0
  135. package/android/src/main/java/com/swmansion/enriched/markdown/views/ContextMenuPopup.kt +9 -6
  136. package/android/src/main/java/com/swmansion/enriched/markdown/views/CopyGlyph.kt +101 -0
  137. package/android/src/main/java/com/swmansion/enriched/markdown/views/TableContainerView.kt +61 -11
  138. package/android/src/main/jni/CMakeLists.txt +53 -0
  139. package/android/src/main/jni/react/renderer/components/EnrichedMarkdownTextSpec/MarkdownContainerShadowNode.cpp +10 -0
  140. package/android/src/main/jni/react/renderer/components/EnrichedMarkdownTextSpec/MarkdownContainerShadowNode.h +11 -2
  141. package/android/src/main/jni/react/renderer/components/EnrichedMarkdownTextSpec/MarkdownTextShadowNode.cpp +10 -0
  142. package/android/src/main/jni/react/renderer/components/EnrichedMarkdownTextSpec/MarkdownTextShadowNode.h +12 -2
  143. package/android/src/main/jni/react/renderer/components/EnrichedMarkdownTextSpec/MarkdownTextState.cpp +9 -0
  144. package/android/src/main/jni/react/renderer/components/EnrichedMarkdownTextSpec/MarkdownTextState.h +24 -0
  145. package/android/src/main/jni/react/renderer/components/EnrichedMarkdownTextSpec/conversions.h +16 -0
  146. package/android/src/math/java/com/swmansion/enriched/markdown/input/math/MathChipControllerImpl.kt +21 -4
  147. package/android/src/math/java/com/swmansion/enriched/markdown/renderer/MathInlineRenderer.kt +8 -2
  148. package/android/src/math/java/com/swmansion/enriched/markdown/spans/MathChipSpan.kt +1 -1
  149. package/android/src/math/java/com/swmansion/enriched/markdown/spans/MathInlineSpan.kt +13 -6
  150. package/android/src/math/java/com/swmansion/enriched/markdown/spans/MathMeasureHelper.kt +2 -1
  151. package/android/src/math/java/com/swmansion/enriched/markdown/views/MathContainerView.kt +26 -8
  152. package/cpp/highlight/CodeBlockHighlighter.cpp +284 -0
  153. package/cpp/highlight/CodeBlockHighlighter.hpp +66 -0
  154. package/cpp/highlight/CodeBlockLanguages.cpp +138 -0
  155. package/cpp/highlight/CodeBlockLanguages.hpp +25 -0
  156. package/cpp/highlight/HighlightGrammars.hpp +28 -0
  157. package/cpp/highlight/code_highlight_podspec.rb +211 -0
  158. package/cpp/highlight/gen-registry.mjs +155 -0
  159. package/cpp/highlight/grammar-versions.json +159 -0
  160. package/cpp/highlight/vendor/generated/generated_queries.h +1665 -0
  161. package/cpp/highlight/vendor/generated/generated_registry.cpp +59 -0
  162. package/cpp/parser/MD4CParser.cpp +173 -61
  163. package/cpp/parser/MD4CParser.hpp +1 -0
  164. package/cpp/parser/MarkdownASTNode.hpp +2 -1
  165. package/cpp/wasm/ASTSerializer.cpp +2 -0
  166. package/cpp/wasm/build.sh +1 -0
  167. package/cpp/wasm/md4c_wasm.cpp +3 -1
  168. package/docs/ACCESSIBILITY.md +14 -2
  169. package/docs/API_REFERENCE.md +405 -12
  170. package/docs/BREAKING_CHANGES.md +129 -0
  171. package/docs/CODE_HIGHLIGHT.md +133 -0
  172. package/docs/COPY_OPTIONS.md +61 -3
  173. package/docs/ELEMENTS_STRUCTURE.md +52 -4
  174. package/docs/IMAGE_CACHING.md +30 -0
  175. package/docs/INPUT.md +110 -11
  176. package/docs/LATEX_MATH.md +87 -45
  177. package/docs/MACOS.md +1 -1
  178. package/docs/MARKDOWN_STREAMING.md +27 -1
  179. package/docs/MENTIONS.md +8 -1
  180. package/docs/NATIVE_ASSETS.md +127 -0
  181. package/docs/RTL.md +1 -1
  182. package/docs/STYLES.md +73 -6
  183. package/docs/TESTING.md +112 -0
  184. package/docs/TEXT.md +18 -6
  185. package/docs/WEB.md +4 -1
  186. package/ios/EnrichedMarkdown.h +7 -0
  187. package/ios/EnrichedMarkdown.mm +583 -76
  188. package/ios/EnrichedMarkdownText.h +7 -0
  189. package/ios/EnrichedMarkdownText.mm +299 -73
  190. package/ios/attachments/ENRMImageAttachment.h +9 -0
  191. package/ios/attachments/ENRMImageAttachment.m +143 -40
  192. package/ios/attachments/ENRMMathInlineAttachment+macOS.m +2 -1
  193. package/ios/attachments/ENRMMathInlineAttachment.h +5 -0
  194. package/ios/attachments/ENRMMathInlineAttachment.m +50 -82
  195. package/ios/attachments/ENRMMathInlineAttachmentShared.h +2 -0
  196. package/ios/generated/ReactCodegen/EnrichedMarkdownTextSpec/EventEmitters.cpp +223 -0
  197. package/ios/generated/ReactCodegen/EnrichedMarkdownTextSpec/EventEmitters.h +183 -0
  198. package/ios/generated/ReactCodegen/EnrichedMarkdownTextSpec/Props.cpp +65 -0
  199. package/ios/generated/ReactCodegen/EnrichedMarkdownTextSpec/Props.h +1086 -61
  200. package/ios/generated/ReactCodegen/EnrichedMarkdownTextSpec/RCTComponentViewHelpers.h +181 -2
  201. package/ios/input/ENRMAutoLinkDetector.h +2 -1
  202. package/ios/input/ENRMAutoLinkDetector.mm +79 -41
  203. package/ios/input/ENRMBlockEditCoordinator.h +71 -0
  204. package/ios/input/ENRMBlockEditCoordinator.mm +195 -0
  205. package/ios/input/ENRMBlockRange.h +28 -0
  206. package/ios/input/ENRMBlockRange.mm +30 -0
  207. package/ios/input/ENRMBlockStore.h +56 -0
  208. package/ios/input/ENRMBlockStore.mm +275 -0
  209. package/ios/input/ENRMClipboardCoordinator.h +45 -0
  210. package/ios/input/ENRMClipboardCoordinator.mm +120 -0
  211. package/ios/input/ENRMDetectorPipeline.h +2 -1
  212. package/ios/input/ENRMEditPipeline.h +76 -0
  213. package/ios/input/ENRMEditPipeline.mm +228 -0
  214. package/ios/input/ENRMEditSession.h +36 -0
  215. package/ios/input/ENRMEditSession.mm +63 -0
  216. package/ios/input/ENRMFormattingStore.h +17 -0
  217. package/ios/input/ENRMFormattingStore.mm +95 -105
  218. package/ios/input/ENRMInputBlockType.h +91 -0
  219. package/ios/input/ENRMInputBlockType.mm +5 -0
  220. package/ios/input/ENRMInputDecorationDrawer.h +18 -0
  221. package/ios/input/ENRMInputEventEmitter.h +56 -0
  222. package/ios/input/ENRMInputEventEmitter.mm +308 -0
  223. package/ios/input/ENRMInputFormatter.h +29 -69
  224. package/ios/input/ENRMInputFormatter.mm +216 -124
  225. package/ios/input/ENRMInputFormatterStyle.h +99 -0
  226. package/ios/input/ENRMInputFormatterStyle.mm +188 -0
  227. package/ios/input/ENRMInputLayoutManager.h +9 -0
  228. package/ios/input/ENRMInputLayoutManager.mm +30 -0
  229. package/ios/input/ENRMInputListMarkerDrawer.h +32 -0
  230. package/ios/input/ENRMInputListMarkerDrawer.mm +426 -0
  231. package/ios/input/ENRMInputParser.h +5 -6
  232. package/ios/input/ENRMInputParser.mm +461 -178
  233. package/ios/input/ENRMInputRemend.mm +2 -2
  234. package/ios/input/ENRMInputStyleStateBuilder.h +40 -0
  235. package/ios/input/ENRMInputStyleStateBuilder.mm +60 -0
  236. package/ios/input/ENRMInputTextView.mm +103 -8
  237. package/ios/input/ENRMInputTypingAttributesController.h +42 -0
  238. package/ios/input/ENRMInputTypingAttributesController.mm +203 -0
  239. package/ios/input/ENRMLinkCoordinator.h +41 -0
  240. package/ios/input/ENRMLinkCoordinator.mm +89 -0
  241. package/ios/input/ENRMMarkdownSerializer.h +29 -5
  242. package/ios/input/ENRMMarkdownSerializer.mm +170 -48
  243. package/ios/input/ENRMMathAtom.h +26 -0
  244. package/ios/input/ENRMMathAtom.mm +12 -0
  245. package/ios/input/ENRMMentionCoordinator.h +45 -0
  246. package/ios/input/ENRMMentionCoordinator.mm +167 -0
  247. package/ios/input/ENRMRangeEditAdjustment.h +38 -0
  248. package/ios/input/ENRMRangeEditAdjustment.mm +91 -0
  249. package/ios/input/ENRMRangeStoreUtils.h +39 -0
  250. package/ios/input/EnrichedMarkdownTextInput+ContextMenu.mm +6 -6
  251. package/ios/input/EnrichedMarkdownTextInput+Internal.h +11 -3
  252. package/ios/input/EnrichedMarkdownTextInput.h +7 -1
  253. package/ios/input/EnrichedMarkdownTextInput.mm +1089 -1023
  254. package/ios/input/InputStylePropsUtils.h +109 -68
  255. package/ios/input/internals/EnrichedMarkdownTextInputShadowNode.mm +2 -1
  256. package/ios/input/styles/ENRMBlockHandler.h +46 -0
  257. package/ios/input/styles/ENRMHeadingBlockHandler.h +15 -0
  258. package/ios/input/styles/ENRMHeadingBlockHandler.mm +38 -0
  259. package/ios/input/styles/ENRMOrderedListBlockHandler.h +14 -0
  260. package/ios/input/styles/ENRMOrderedListBlockHandler.mm +48 -0
  261. package/ios/input/styles/ENRMUnorderedListBlockHandler.h +15 -0
  262. package/ios/input/styles/ENRMUnorderedListBlockHandler.mm +51 -0
  263. package/ios/internals/ENRMViewFreeMeasurement.h +331 -0
  264. package/ios/internals/EnrichedMarkdownShadowNode.h +1 -3
  265. package/ios/internals/EnrichedMarkdownShadowNode.mm +16 -20
  266. package/ios/internals/EnrichedMarkdownTextShadowNode.h +1 -3
  267. package/ios/internals/EnrichedMarkdownTextShadowNode.mm +15 -20
  268. package/ios/internals/MeasurementCache.h +41 -9
  269. package/ios/internals/ShadowMeasurementUtils.h +63 -58
  270. package/ios/math/ENRMMathChipController.h +74 -0
  271. package/ios/math/ENRMMathChipController.mm +476 -0
  272. package/ios/math/ENRMRaTeXBridge.swift +27 -6
  273. package/ios/parser/ENRMMarkdownParser.h +1 -8
  274. package/ios/parser/ENRMMarkdownParser.mm +2 -11
  275. package/ios/parser/MarkdownASTNode.h +2 -1
  276. package/ios/parser/MarkdownParserBridge.mm +4 -0
  277. package/ios/renderer/AttributedRenderer.m +20 -2
  278. package/ios/renderer/BaseRenderer.h +17 -2
  279. package/ios/renderer/BaseRenderer.m +30 -0
  280. package/ios/renderer/BlockquoteRenderer.h +1 -1
  281. package/ios/renderer/BlockquoteRenderer.m +144 -35
  282. package/ios/renderer/CodeBlockRenderer.h +1 -1
  283. package/ios/renderer/CodeBlockRenderer.m +27 -23
  284. package/ios/renderer/CodeRenderer.h +1 -1
  285. package/ios/renderer/CodeRenderer.m +3 -1
  286. package/ios/renderer/ENRMImageRenderer.h +1 -1
  287. package/ios/renderer/ENRMImageRenderer.m +5 -1
  288. package/ios/renderer/ENRMMathInlineRenderer.h +1 -1
  289. package/ios/renderer/ENRMMathInlineRenderer.m +6 -1
  290. package/ios/renderer/ENRMSpoilerRenderer.h +1 -1
  291. package/ios/renderer/ENRMSpoilerRenderer.m +3 -1
  292. package/ios/renderer/EmphasisRenderer.h +1 -1
  293. package/ios/renderer/EmphasisRenderer.m +3 -1
  294. package/ios/renderer/HeadingRenderer.h +1 -1
  295. package/ios/renderer/HeadingRenderer.m +13 -6
  296. package/ios/renderer/HighlightRenderer.h +1 -1
  297. package/ios/renderer/HighlightRenderer.m +3 -1
  298. package/ios/renderer/LinkRenderer.h +1 -1
  299. package/ios/renderer/LinkRenderer.m +50 -16
  300. package/ios/renderer/ListItemRenderer.h +13 -1
  301. package/ios/renderer/ListItemRenderer.m +102 -44
  302. package/ios/renderer/ListRenderer.h +2 -2
  303. package/ios/renderer/ListRenderer.m +63 -25
  304. package/ios/renderer/ParagraphRenderer.h +1 -1
  305. package/ios/renderer/ParagraphRenderer.m +16 -8
  306. package/ios/renderer/RenderContext.h +10 -0
  307. package/ios/renderer/RenderContext.m +44 -0
  308. package/ios/renderer/RendererFactory.m +14 -0
  309. package/ios/renderer/StrikethroughRenderer.h +1 -1
  310. package/ios/renderer/StrikethroughRenderer.m +3 -1
  311. package/ios/renderer/StrongRenderer.h +1 -1
  312. package/ios/renderer/StrongRenderer.m +3 -1
  313. package/ios/renderer/SubscriptRenderer.h +1 -1
  314. package/ios/renderer/SubscriptRenderer.m +3 -1
  315. package/ios/renderer/SuperscriptRenderer.h +1 -1
  316. package/ios/renderer/SuperscriptRenderer.m +3 -1
  317. package/ios/renderer/TextRenderer.h +2 -2
  318. package/ios/renderer/TextRenderer.m +3 -1
  319. package/ios/renderer/ThematicBreakRenderer.h +1 -1
  320. package/ios/renderer/ThematicBreakRenderer.m +3 -1
  321. package/ios/renderer/UnderlineRenderer.h +1 -1
  322. package/ios/renderer/UnderlineRenderer.m +3 -1
  323. package/ios/styles/StyleConfig.h +42 -0
  324. package/ios/styles/StyleConfig.mm +216 -0
  325. package/ios/utils/BlockquoteBorder.h +6 -0
  326. package/ios/utils/BlockquoteBorder.m +249 -52
  327. package/ios/utils/CodeBackground.m +3 -65
  328. package/ios/utils/CodeBlockBackground.m +16 -2
  329. package/ios/utils/ENRMAtomicSize.h +65 -0
  330. package/ios/utils/ENRMBlockMenu.h +66 -0
  331. package/ios/utils/ENRMChipDrawing.h +24 -0
  332. package/ios/utils/ENRMChipDrawing.m +83 -0
  333. package/ios/utils/ENRMCodeBlockContent.h +37 -0
  334. package/ios/utils/ENRMCodeBlockContent.mm +79 -0
  335. package/ios/utils/ENRMCodeBlockHighlighter.h +37 -0
  336. package/ios/utils/ENRMCodeBlockHighlighter.mm +51 -0
  337. package/ios/utils/ENRMFeatureFlags.h +7 -0
  338. package/ios/utils/ENRMImageDownloader.h +11 -1
  339. package/ios/utils/ENRMImageDownloader.m +60 -16
  340. package/ios/utils/ENRMLinkChip.h +70 -0
  341. package/ios/utils/ENRMLinkChip.m +213 -0
  342. package/ios/utils/ENRMLinkLayout.h +50 -0
  343. package/ios/utils/ENRMLinkLayout.m +45 -0
  344. package/ios/utils/ENRMLocalImageLoader.h +31 -0
  345. package/ios/utils/ENRMLocalImageLoader.m +68 -0
  346. package/ios/utils/ENRMMathFallback.h +26 -0
  347. package/ios/utils/ENRMMathFallback.m +18 -0
  348. package/ios/utils/ENRMSelectionChange.h +120 -0
  349. package/ios/utils/ENRMSelectionChange.m +282 -0
  350. package/ios/utils/ENRMTextViewSetup.h +35 -17
  351. package/ios/utils/EditMenuUtils+macOS.m +4 -1
  352. package/ios/utils/EditMenuUtils.h +35 -6
  353. package/ios/utils/EditMenuUtils.m +188 -11
  354. package/ios/utils/HTMLGenerator.m +2 -1
  355. package/ios/utils/ImageRequestHeaderUtils.h +35 -0
  356. package/ios/utils/LastElementUtils.h +1 -0
  357. package/ios/utils/ListMarkerDrawer.m +29 -42
  358. package/ios/utils/MarkdownASTSerializer.m +4 -0
  359. package/ios/utils/MarkdownAccessibilityElementBuilder.m +3 -1
  360. package/ios/utils/MarkdownExtractor.m +2 -1
  361. package/ios/utils/ParagraphStyleUtils.h +5 -0
  362. package/ios/utils/ParagraphStyleUtils.m +77 -17
  363. package/ios/utils/RTFExportUtils.m +2 -0
  364. package/ios/utils/RenderedMarkdownSegment.h +13 -1
  365. package/ios/utils/RenderedMarkdownSegment.m +20 -0
  366. package/ios/utils/SegmentRenderer.m +17 -4
  367. package/ios/utils/StreamingMarkdownFilter.h +11 -1
  368. package/ios/utils/StreamingMarkdownFilter.m +98 -2
  369. package/ios/utils/StylePropsUtils.h +110 -1
  370. package/ios/utils/TaskListTapUtils.m +24 -0
  371. package/ios/utils/TextViewLayoutManager.mm +3 -0
  372. package/ios/views/ENRMCodeBlockContainerView.h +60 -0
  373. package/ios/views/ENRMCodeBlockContainerView.m +569 -0
  374. package/ios/views/ENRMMathContainerView.h +23 -0
  375. package/ios/views/ENRMMathContainerView.m +87 -20
  376. package/ios/views/TableContainerView.h +32 -0
  377. package/ios/views/TableContainerView.m +291 -175
  378. package/jest.d.ts +1 -0
  379. package/jest.js +5 -0
  380. package/lib/module/EnrichedMarkdownNativeComponent.ts +203 -1
  381. package/lib/module/EnrichedMarkdownTextInput.js +84 -5
  382. package/lib/module/EnrichedMarkdownTextInput.js.map +1 -1
  383. package/lib/module/EnrichedMarkdownTextInputNativeComponent.ts +78 -5
  384. package/lib/module/EnrichedMarkdownTextNativeComponent.ts +204 -1
  385. package/lib/module/headingDefaults.js +34 -0
  386. package/lib/module/headingDefaults.js.map +1 -0
  387. package/lib/module/index.js.map +1 -1
  388. package/lib/module/jest/index.js +205 -0
  389. package/lib/module/jest/index.js.map +1 -0
  390. package/lib/module/native/EnrichedMarkdownText.js +199 -15
  391. package/lib/module/native/EnrichedMarkdownText.js.map +1 -1
  392. package/lib/module/normalizeMarkdownStyle.js +98 -23
  393. package/lib/module/normalizeMarkdownStyle.js.map +1 -1
  394. package/lib/module/normalizeMarkdownStyle.web.js +73 -22
  395. package/lib/module/normalizeMarkdownStyle.web.js.map +1 -1
  396. package/lib/module/normalizeMarkdownTextInputStyle.js +62 -15
  397. package/lib/module/normalizeMarkdownTextInputStyle.js.map +1 -1
  398. package/lib/module/normalizeMenuItem.js +1 -1
  399. package/lib/module/utils/textInputState.js +26 -0
  400. package/lib/module/utils/textInputState.js.map +1 -0
  401. package/lib/module/web/EnrichedMarkdownText.js +15 -8
  402. package/lib/module/web/EnrichedMarkdownText.js.map +1 -1
  403. package/lib/module/web/parseMarkdown.js +4 -3
  404. package/lib/module/web/parseMarkdown.js.map +1 -1
  405. package/lib/module/web/renderers/InlineRenderers.js +102 -3
  406. package/lib/module/web/renderers/InlineRenderers.js.map +1 -1
  407. package/lib/module/web/renderers/ListRenderers.js +7 -2
  408. package/lib/module/web/renderers/ListRenderers.js.map +1 -1
  409. package/lib/module/web/renderers/index.js +7 -4
  410. package/lib/module/web/renderers/index.js.map +1 -1
  411. package/lib/module/web/styles.js +101 -6
  412. package/lib/module/web/styles.js.map +1 -1
  413. package/lib/module/web/utils.js +14 -0
  414. package/lib/module/web/utils.js.map +1 -1
  415. package/lib/module/web/wasm/md4c.js +0 -0
  416. package/lib/module/web/wasm/md4c.js.map +1 -1
  417. package/lib/typescript/src/EnrichedMarkdownNativeComponent.d.ts +185 -2
  418. package/lib/typescript/src/EnrichedMarkdownNativeComponent.d.ts.map +1 -1
  419. package/lib/typescript/src/EnrichedMarkdownTextInput.d.ts +94 -9
  420. package/lib/typescript/src/EnrichedMarkdownTextInput.d.ts.map +1 -1
  421. package/lib/typescript/src/EnrichedMarkdownTextInputNativeComponent.d.ts +69 -5
  422. package/lib/typescript/src/EnrichedMarkdownTextInputNativeComponent.d.ts.map +1 -1
  423. package/lib/typescript/src/EnrichedMarkdownTextNativeComponent.d.ts +185 -2
  424. package/lib/typescript/src/EnrichedMarkdownTextNativeComponent.d.ts.map +1 -1
  425. package/lib/typescript/src/headingDefaults.d.ts +9 -0
  426. package/lib/typescript/src/headingDefaults.d.ts.map +1 -0
  427. package/lib/typescript/src/index.d.ts +3 -3
  428. package/lib/typescript/src/index.d.ts.map +1 -1
  429. package/lib/typescript/src/index.web.d.ts +2 -2
  430. package/lib/typescript/src/index.web.d.ts.map +1 -1
  431. package/lib/typescript/src/jest/index.d.ts +6 -0
  432. package/lib/typescript/src/jest/index.d.ts.map +1 -0
  433. package/lib/typescript/src/native/EnrichedMarkdownText.d.ts +5 -5
  434. package/lib/typescript/src/native/EnrichedMarkdownText.d.ts.map +1 -1
  435. package/lib/typescript/src/normalizeMarkdownStyle.d.ts.map +1 -1
  436. package/lib/typescript/src/normalizeMarkdownStyle.web.d.ts.map +1 -1
  437. package/lib/typescript/src/normalizeMarkdownTextInputStyle.d.ts +19 -5
  438. package/lib/typescript/src/normalizeMarkdownTextInputStyle.d.ts.map +1 -1
  439. package/lib/typescript/src/types/MarkdownStyle.d.ts +122 -5
  440. package/lib/typescript/src/types/MarkdownStyle.d.ts.map +1 -1
  441. package/lib/typescript/src/types/MarkdownStyleInternal.d.ts +39 -0
  442. package/lib/typescript/src/types/MarkdownStyleInternal.d.ts.map +1 -1
  443. package/lib/typescript/src/types/MarkdownTextProps.d.ts +207 -10
  444. package/lib/typescript/src/types/MarkdownTextProps.d.ts.map +1 -1
  445. package/lib/typescript/src/types/MarkdownTextProps.web.d.ts +60 -1
  446. package/lib/typescript/src/types/MarkdownTextProps.web.d.ts.map +1 -1
  447. package/lib/typescript/src/types/events.d.ts +85 -0
  448. package/lib/typescript/src/types/events.d.ts.map +1 -1
  449. package/lib/typescript/src/utils/textInputState.d.ts +24 -0
  450. package/lib/typescript/src/utils/textInputState.d.ts.map +1 -0
  451. package/lib/typescript/src/web/EnrichedMarkdownText.d.ts +1 -1
  452. package/lib/typescript/src/web/EnrichedMarkdownText.d.ts.map +1 -1
  453. package/lib/typescript/src/web/parseMarkdown.d.ts +1 -1
  454. package/lib/typescript/src/web/parseMarkdown.d.ts.map +1 -1
  455. package/lib/typescript/src/web/renderers/InlineRenderers.d.ts.map +1 -1
  456. package/lib/typescript/src/web/renderers/ListRenderers.d.ts.map +1 -1
  457. package/lib/typescript/src/web/renderers/index.d.ts +2 -1
  458. package/lib/typescript/src/web/renderers/index.d.ts.map +1 -1
  459. package/lib/typescript/src/web/styles.d.ts +2 -1
  460. package/lib/typescript/src/web/styles.d.ts.map +1 -1
  461. package/lib/typescript/src/web/types.d.ts +10 -2
  462. package/lib/typescript/src/web/types.d.ts.map +1 -1
  463. package/lib/typescript/src/web/utils.d.ts +4 -0
  464. package/lib/typescript/src/web/utils.d.ts.map +1 -1
  465. package/package.json +36 -9
  466. package/postinstall.mjs +131 -0
  467. package/ratex-version.json +21 -0
  468. package/src/EnrichedMarkdownNativeComponent.ts +203 -1
  469. package/src/EnrichedMarkdownTextInput.tsx +159 -8
  470. package/src/EnrichedMarkdownTextInputNativeComponent.ts +78 -5
  471. package/src/EnrichedMarkdownTextNativeComponent.ts +204 -1
  472. package/src/headingDefaults.ts +21 -0
  473. package/src/index.tsx +15 -0
  474. package/src/index.web.tsx +6 -1
  475. package/src/jest/index.tsx +236 -0
  476. package/src/native/EnrichedMarkdownText.tsx +260 -11
  477. package/src/normalizeMarkdownStyle.ts +117 -16
  478. package/src/normalizeMarkdownStyle.web.ts +76 -15
  479. package/src/normalizeMarkdownTextInputStyle.ts +110 -35
  480. package/src/normalizeMenuItem.ts +1 -1
  481. package/src/types/MarkdownStyle.ts +125 -5
  482. package/src/types/MarkdownStyleInternal.ts +51 -0
  483. package/src/types/MarkdownTextProps.ts +215 -10
  484. package/src/types/MarkdownTextProps.web.ts +62 -1
  485. package/src/types/events.ts +90 -0
  486. package/src/utils/textInputState.ts +35 -0
  487. package/src/web/EnrichedMarkdownText.tsx +26 -5
  488. package/src/web/parseMarkdown.ts +6 -2
  489. package/src/web/renderers/InlineRenderers.tsx +116 -3
  490. package/src/web/renderers/ListRenderers.tsx +14 -2
  491. package/src/web/renderers/index.tsx +6 -2
  492. package/src/web/styles.ts +114 -5
  493. package/src/web/types.ts +10 -1
  494. package/src/web/utils.ts +9 -0
  495. package/src/web/wasm/md4c.js +0 -0
  496. package/vendor-grammars.mjs +511 -0
  497. package/vendor-ratex.mjs +173 -0
  498. package/app.plugin.js +0 -2
  499. package/plugin/build/withAndroidMath.js +0 -19
  500. package/plugin/build/withIosMath.js +0 -28
  501. package/plugin/build/withReactNativeEnrichedMarkdown.js +0 -11
  502. package/plugin/src/withAndroidMath.ts +0 -24
  503. package/plugin/src/withIosMath.ts +0 -35
  504. package/plugin/src/withReactNativeEnrichedMarkdown.ts +0 -17
  505. package/plugin/tsconfig.build.json +0 -16
@@ -0,0 +1,83 @@
1
+ #import "ENRMChipDrawing.h"
2
+
3
+ static UIBezierPath *chipFillPath(CGRect rect, CGFloat r, BOOL isFirst, BOOL isLast)
4
+ {
5
+ #if !TARGET_OS_OSX
6
+ UIRectCorner corners = 0;
7
+ if (isFirst)
8
+ corners |= (UIRectCornerTopLeft | UIRectCornerBottomLeft);
9
+ if (isLast)
10
+ corners |= (UIRectCornerTopRight | UIRectCornerBottomRight);
11
+
12
+ return [UIBezierPath bezierPathWithRoundedRect:rect byRoundingCorners:corners cornerRadii:CGSizeMake(r, r)];
13
+ #else
14
+ // NSBezierPath doesn't support per-corner rounding — use uniform corner radius
15
+ return UIBezierPathWithRoundedRect(rect, (isFirst || isLast) ? r : 0);
16
+ #endif
17
+ }
18
+
19
+ static UIBezierPath *chipOpenBorderPath(CGRect rect, CGFloat r, CGFloat borderWidth, BOOL isFirst, BOOL isLast)
20
+ {
21
+ UIBezierPath *path = [UIBezierPath bezierPath];
22
+ CGFloat inset = borderWidth / 2.0;
23
+ CGRect insetRect = CGRectInset(rect, inset, inset);
24
+
25
+ if (isFirst) {
26
+ [path moveToPoint:CGPointMake(CGRectGetMaxX(rect), insetRect.origin.y)];
27
+ BezierPathAddLine(path, CGPointMake(insetRect.origin.x + r, insetRect.origin.y));
28
+ BezierPathAddQuadCurve(path, CGPointMake(insetRect.origin.x, insetRect.origin.y + r),
29
+ CGPointMake(insetRect.origin.x, insetRect.origin.y));
30
+ BezierPathAddLine(path, CGPointMake(insetRect.origin.x, CGRectGetMaxY(insetRect) - r));
31
+ BezierPathAddQuadCurve(path, CGPointMake(insetRect.origin.x + r, CGRectGetMaxY(insetRect)),
32
+ CGPointMake(insetRect.origin.x, CGRectGetMaxY(insetRect)));
33
+ BezierPathAddLine(path, CGPointMake(CGRectGetMaxX(rect), CGRectGetMaxY(insetRect)));
34
+ } else if (isLast) {
35
+ [path moveToPoint:CGPointMake(rect.origin.x, insetRect.origin.y)];
36
+ BezierPathAddLine(path, CGPointMake(CGRectGetMaxX(insetRect) - r, insetRect.origin.y));
37
+ BezierPathAddQuadCurve(path, CGPointMake(CGRectGetMaxX(insetRect), insetRect.origin.y + r),
38
+ CGPointMake(CGRectGetMaxX(insetRect), insetRect.origin.y));
39
+ BezierPathAddLine(path, CGPointMake(CGRectGetMaxX(insetRect), CGRectGetMaxY(insetRect) - r));
40
+ BezierPathAddQuadCurve(path, CGPointMake(CGRectGetMaxX(insetRect) - r, CGRectGetMaxY(insetRect)),
41
+ CGPointMake(CGRectGetMaxX(insetRect), CGRectGetMaxY(insetRect)));
42
+ BezierPathAddLine(path, CGPointMake(rect.origin.x, CGRectGetMaxY(insetRect)));
43
+ } else {
44
+ [path moveToPoint:CGPointMake(rect.origin.x, insetRect.origin.y)];
45
+ BezierPathAddLine(path, CGPointMake(CGRectGetMaxX(rect), insetRect.origin.y));
46
+ [path moveToPoint:CGPointMake(rect.origin.x, CGRectGetMaxY(insetRect))];
47
+ BezierPathAddLine(path, CGPointMake(CGRectGetMaxX(rect), CGRectGetMaxY(insetRect)));
48
+ }
49
+ return path;
50
+ }
51
+
52
+ void ENRMDrawChipFragment(CGRect rect, RCTUIColor *backgroundColor, RCTUIColor *borderColor, CGFloat borderWidth,
53
+ CGFloat cornerRadius, BOOL isFirst, BOOL isLast, BOOL strokeInset)
54
+ {
55
+ if (CGRectIsEmpty(rect))
56
+ return;
57
+
58
+ CGFloat r = MIN(MAX(cornerRadius, 0), MIN(rect.size.width, rect.size.height) / 2.0);
59
+
60
+ if (backgroundColor) {
61
+ [backgroundColor setFill];
62
+ [chipFillPath(rect, r, isFirst, isLast) fill];
63
+ }
64
+
65
+ if (!borderColor || borderWidth <= 0)
66
+ return;
67
+
68
+ [borderColor setStroke];
69
+ UIBezierPath *strokePath;
70
+ if (isFirst && isLast) {
71
+ if (strokeInset) {
72
+ CGFloat inset = borderWidth / 2.0;
73
+ strokePath = chipFillPath(CGRectInset(rect, inset, inset), MAX(r - inset, 0), YES, YES);
74
+ } else {
75
+ strokePath = chipFillPath(rect, r, YES, YES);
76
+ }
77
+ } else {
78
+ strokePath = chipOpenBorderPath(rect, r, borderWidth, isFirst, isLast);
79
+ }
80
+ strokePath.lineWidth = borderWidth;
81
+ BezierPathSetRoundStyle(strokePath);
82
+ [strokePath stroke];
83
+ }
@@ -0,0 +1,37 @@
1
+ #pragma once
2
+
3
+ #import <Foundation/Foundation.h>
4
+
5
+ @class MarkdownASTNode;
6
+ @class StyleConfig;
7
+
8
+ NS_ASSUME_NONNULL_BEGIN
9
+
10
+ #ifdef __cplusplus
11
+ extern "C" {
12
+ #endif
13
+
14
+ /// Shared code block node semantics, used by both markdown flavors so the
15
+ /// meaning of a CodeBlock AST node (its text, language, fence) is defined in
16
+ /// one place. Language display names come from the shared C++ core
17
+ /// (cpp/highlight/CodeBlockLanguages.hpp) so all platforms label fences
18
+ /// identically.
19
+
20
+ NSString *ENRMCodeBlockExtractCode(MarkdownASTNode *node);
21
+ NSString *_Nullable ENRMCodeBlockLanguage(MarkdownASTNode *node);
22
+ NSString *ENRMCodeBlockFenceChar(MarkdownASTNode *node);
23
+ NSString *ENRMCodeBlockFencedMarkdown(NSString *code, NSString *_Nullable language, NSString *fenceChar);
24
+ NSString *ENRMCodeBlockDisplayLanguageName(NSString *_Nullable language);
25
+
26
+ /// Applies the flavor-independent code block text attributes (code font,
27
+ /// color, line height, forced-LTR left-aligned paragraph) to the range.
28
+ /// Callers layer their container-specific paragraph adjustments on top (the
29
+ /// commonmark span flavor adds padding indents; the github block view has
30
+ /// none).
31
+ void ENRMApplyCodeBlockTextAttributes(NSMutableAttributedString *string, NSRange range, StyleConfig *config);
32
+
33
+ #ifdef __cplusplus
34
+ }
35
+ #endif
36
+
37
+ NS_ASSUME_NONNULL_END
@@ -0,0 +1,79 @@
1
+ #import "ENRMCodeBlockContent.h"
2
+ #include "CodeBlockLanguages.hpp"
3
+ #import "ENRMUIKit.h"
4
+ #import "MarkdownASTNode.h"
5
+ #import "ParagraphStyleUtils.h"
6
+ #import "StyleConfig.h"
7
+
8
+ static void ENRMAppendNodeContent(MarkdownASTNode *node, NSMutableString *output)
9
+ {
10
+ if (node.content.length > 0) {
11
+ [output appendString:node.content];
12
+ }
13
+ for (MarkdownASTNode *child in node.children) {
14
+ ENRMAppendNodeContent(child, output);
15
+ }
16
+ }
17
+
18
+ NSString *ENRMCodeBlockExtractCode(MarkdownASTNode *node)
19
+ {
20
+ NSMutableString *code = [NSMutableString string];
21
+ ENRMAppendNodeContent(node, code);
22
+ NSUInteger end = code.length;
23
+ while (end > 0 && [code characterAtIndex:end - 1] == '\n') {
24
+ end--;
25
+ }
26
+ return [code substringToIndex:end];
27
+ }
28
+
29
+ NSString *ENRMCodeBlockLanguage(MarkdownASTNode *node)
30
+ {
31
+ NSString *language = node.attributes[@"language"];
32
+ return language.length > 0 ? language : nil;
33
+ }
34
+
35
+ NSString *ENRMCodeBlockFenceChar(MarkdownASTNode *node)
36
+ {
37
+ NSString *fenceChar = node.attributes[@"fenceChar"];
38
+ return fenceChar.length > 0 ? fenceChar : @"`";
39
+ }
40
+
41
+ NSString *ENRMCodeBlockFencedMarkdown(NSString *code, NSString *language, NSString *fenceChar)
42
+ {
43
+ NSString *fence = [@"" stringByPaddingToLength:3 withString:fenceChar startingAtIndex:0];
44
+ return [NSString stringWithFormat:@"%@%@\n%@\n%@", fence, language ?: @"", code, fence];
45
+ }
46
+
47
+ NSString *ENRMCodeBlockDisplayLanguageName(NSString *language)
48
+ {
49
+ if (language.length == 0) {
50
+ return @"";
51
+ }
52
+ std::string display = Markdown::displayNameForLanguage(language.UTF8String ?: "");
53
+ return [NSString stringWithUTF8String:display.c_str()] ?: language;
54
+ }
55
+
56
+ void ENRMApplyCodeBlockTextAttributes(NSMutableAttributedString *string, NSRange range, StyleConfig *config)
57
+ {
58
+ if (range.length == 0) {
59
+ return;
60
+ }
61
+
62
+ UIFont *font = [config codeBlockFont];
63
+ RCTUIColor *color = [config codeBlockColor];
64
+ if (color) {
65
+ [string addAttributes:@{NSFontAttributeName : font, NSForegroundColorAttributeName : color} range:range];
66
+ } else {
67
+ [string addAttribute:NSFontAttributeName value:font range:range];
68
+ }
69
+
70
+ CGFloat lineHeight = [config codeBlockLineHeight];
71
+ if (lineHeight > 0) {
72
+ applyLineHeight(string, range, lineHeight);
73
+ }
74
+
75
+ NSMutableParagraphStyle *paragraphStyle = [getOrCreateParagraphStyle(string, range.location) mutableCopy];
76
+ paragraphStyle.baseWritingDirection = NSWritingDirectionLeftToRight;
77
+ paragraphStyle.alignment = NSTextAlignmentLeft;
78
+ [string addAttribute:NSParagraphStyleAttributeName value:paragraphStyle range:range];
79
+ }
@@ -0,0 +1,37 @@
1
+ #pragma once
2
+
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
+ /// Platform adapter over the shared C++ syntax highlighting seam
14
+ /// (cpp/highlight/CodeBlockHighlighter.hpp).
15
+ ///
16
+ /// Applies token colors as foreground-color attributes onto a mutable copy of
17
+ /// the plain styled code, so highlighting can never change text metrics and
18
+ /// the block height measured from the plain string stays valid. Token colors
19
+ /// come from the config's resolved per-token palette. Returns nil when
20
+ /// highlighting is unavailable (module compiled out, unknown language, parse
21
+ /// failure); callers keep the plain attributed code.
22
+ NSAttributedString *_Nullable ENRMHighlightedAttributedCode(NSAttributedString *plainCode, NSString *code,
23
+ NSString *_Nullable language, StyleConfig *config);
24
+
25
+ /// Applies token foreground colors from the config's palette onto `output`
26
+ /// within `range` (range.location is where the code begins in output). Used by
27
+ /// the commonmark flavor, which renders code inline instead of as a container.
28
+ /// Returns whether any color was applied. No-op when highlighting is
29
+ /// unavailable, so callers keep the plain rendering.
30
+ BOOL ENRMApplyHighlightTokens(NSMutableAttributedString *output, NSRange range, NSString *code,
31
+ NSString *_Nullable language, StyleConfig *config);
32
+
33
+ #ifdef __cplusplus
34
+ }
35
+ #endif
36
+
37
+ NS_ASSUME_NONNULL_END
@@ -0,0 +1,51 @@
1
+ #import "ENRMCodeBlockHighlighter.h"
2
+ #include "CodeBlockHighlighter.hpp"
3
+ #import "ENRMUIKit.h"
4
+ #import "StyleConfig.h"
5
+
6
+ BOOL ENRMApplyHighlightTokens(NSMutableAttributedString *output, NSRange range, NSString *code,
7
+ NSString *_Nullable language, StyleConfig *config)
8
+ {
9
+ if (code.length == 0) {
10
+ return NO;
11
+ }
12
+
13
+ std::vector<Markdown::HighlightToken> tokens;
14
+ try {
15
+ tokens = Markdown::highlightCode(code.UTF8String ?: "", language.UTF8String ?: "");
16
+ } catch (...) {
17
+ return NO;
18
+ }
19
+ if (tokens.empty()) {
20
+ return NO;
21
+ }
22
+
23
+ NSUInteger cap = MIN(NSMaxRange(range), output.length);
24
+ BOOL applied = NO;
25
+ for (const auto &token : tokens) {
26
+ RCTUIColor *color = [config codeBlockSyntaxColorForToken:(NSInteger)token.type];
27
+ if (!color || token.end <= token.start) {
28
+ continue;
29
+ }
30
+ NSUInteger start = range.location + token.start;
31
+ NSUInteger end = range.location + token.end;
32
+ if (end > cap) {
33
+ continue;
34
+ }
35
+ [output addAttribute:NSForegroundColorAttributeName value:color range:NSMakeRange(start, end - start)];
36
+ applied = YES;
37
+ }
38
+ return applied;
39
+ }
40
+
41
+ NSAttributedString *ENRMHighlightedAttributedCode(NSAttributedString *plainCode, NSString *code,
42
+ NSString *_Nullable language, StyleConfig *config)
43
+ {
44
+ if (code.length == 0) {
45
+ return nil;
46
+ }
47
+
48
+ NSMutableAttributedString *highlighted = [plainCode mutableCopy];
49
+ BOOL applied = ENRMApplyHighlightTokens(highlighted, NSMakeRange(0, highlighted.length), code, language, config);
50
+ return applied ? highlighted : nil;
51
+ }
@@ -10,3 +10,10 @@
10
10
  #if !defined(ENRICHED_MARKDOWN_MATH)
11
11
  #define ENRICHED_MARKDOWN_MATH 0
12
12
  #endif
13
+
14
+ // Code-block syntax highlighting is defined purely by the podspec (no external
15
+ // framework to auto-detect, unlike RaTeX). Default off when the podspec did not
16
+ // enable it; the C++ seam then degrades to no tokens.
17
+ #if !defined(ENRICHED_MARKDOWN_CODE_HIGHLIGHT)
18
+ #define ENRICHED_MARKDOWN_CODE_HIGHLIGHT 0
19
+ #endif
@@ -5,11 +5,21 @@ NS_ASSUME_NONNULL_BEGIN
5
5
 
6
6
  typedef void (^ENRMImageDownloadCompletion)(RCTUIImage *_Nullable image);
7
7
 
8
+ /**
9
+ * Cache identity for a remote image request. Returns the URL itself when no
10
+ * headers are set; otherwise appends a SHA-256 digest of the sorted header
11
+ * pairs, so the same URL fetched with different headers is cached and
12
+ * deduplicated separately without embedding header values in the key.
13
+ */
14
+ NSString *ENRMImageCacheKey(NSString *url, NSDictionary<NSString *, NSString *> *_Nullable headers);
15
+
8
16
  @interface ENRMImageDownloader : NSObject
9
17
 
10
18
  + (instancetype)shared;
11
19
 
12
- - (void)downloadURL:(NSString *)url completion:(ENRMImageDownloadCompletion)completion;
20
+ - (void)downloadURL:(NSString *)url
21
+ headers:(nullable NSDictionary<NSString *, NSString *> *)headers
22
+ completion:(ENRMImageDownloadCompletion)completion;
13
23
 
14
24
  @end
15
25
 
@@ -1,5 +1,7 @@
1
1
  #import "ENRMImageDownloader.h"
2
2
  #import "ENRMImageAttachment.h"
3
+ #import "ENRMLocalImageLoader.h"
4
+ #import <CommonCrypto/CommonDigest.h>
3
5
  #include <TargetConditionals.h>
4
6
 
5
7
  static const NSUInteger kDiskCacheMemoryCapacity = 10 * 1024 * 1024;
@@ -13,6 +15,27 @@ static inline NSUInteger ENRMImageByteCost(RCTUIImage *image)
13
15
  return CGImageGetBytesPerRow(cgImage) * CGImageGetHeight(cgImage);
14
16
  }
15
17
 
18
+ NSString *ENRMImageCacheKey(NSString *url, NSDictionary<NSString *, NSString *> *headers)
19
+ {
20
+ if (headers.count == 0) {
21
+ return url;
22
+ }
23
+ NSArray<NSString *> *names = [headers.allKeys sortedArrayUsingSelector:@selector(compare:)];
24
+ NSMutableArray<NSString *> *pairs = [NSMutableArray arrayWithCapacity:names.count];
25
+ for (NSString *name in names) {
26
+ [pairs addObject:[NSString stringWithFormat:@"%@:%@", name, headers[name]]];
27
+ }
28
+ NSString *joined = [pairs componentsJoinedByString:@"\n"];
29
+ NSData *data = [joined dataUsingEncoding:NSUTF8StringEncoding];
30
+ unsigned char digest[CC_SHA256_DIGEST_LENGTH];
31
+ CC_SHA256(data.bytes, (CC_LONG)data.length, digest);
32
+ NSMutableString *hash = [NSMutableString stringWithCapacity:CC_SHA256_DIGEST_LENGTH * 2];
33
+ for (int i = 0; i < CC_SHA256_DIGEST_LENGTH; i++) {
34
+ [hash appendFormat:@"%02x", digest[i]];
35
+ }
36
+ return [NSString stringWithFormat:@"%@|%@", url, hash];
37
+ }
38
+
16
39
  @implementation ENRMImageDownloader {
17
40
  NSURLSession *_session;
18
41
  NSMutableDictionary<NSString *, NSMutableArray<ENRMImageDownloadCompletion> *> *_inFlightRequests;
@@ -43,56 +66,77 @@ static inline NSUInteger ENRMImageByteCost(RCTUIImage *image)
43
66
  return self;
44
67
  }
45
68
 
46
- - (void)downloadURL:(NSString *)url completion:(ENRMImageDownloadCompletion)completion
69
+ - (void)downloadURL:(NSString *)url
70
+ headers:(NSDictionary<NSString *, NSString *> *)headers
71
+ completion:(ENRMImageDownloadCompletion)completion
47
72
  {
48
73
  if (url.length == 0) {
49
74
  completion(nil);
50
75
  return;
51
76
  }
52
77
 
53
- RCTUIImage *cached = [[ENRMImageAttachment originalImageCache] objectForKey:url];
78
+ BOOL isLocal = ENRMIsLocalImageURL(url);
79
+ NSString *cacheKey = isLocal ? url : ENRMImageCacheKey(url, headers);
80
+
81
+ RCTUIImage *cached = [[ENRMImageAttachment originalImageCache] objectForKey:cacheKey];
54
82
  if (cached) {
55
83
  completion(cached);
56
84
  return;
57
85
  }
58
86
 
87
+ if (isLocal) {
88
+ RCTUIImage *local = ENRMLoadLocalImage(url);
89
+ if (local) {
90
+ [[ENRMImageAttachment originalImageCache] setObject:local forKey:cacheKey cost:ENRMImageByteCost(local)];
91
+ }
92
+ completion(local);
93
+ return;
94
+ }
95
+
59
96
  @synchronized(_inFlightRequests) {
60
- NSMutableArray *existing = _inFlightRequests[url];
97
+ NSMutableArray *existing = _inFlightRequests[cacheKey];
61
98
  if (existing) {
62
99
  [existing addObject:completion];
63
100
  return;
64
101
  }
65
- _inFlightRequests[url] = [NSMutableArray arrayWithObject:completion];
102
+ _inFlightRequests[cacheKey] = [NSMutableArray arrayWithObject:completion];
66
103
  }
67
104
 
68
105
  NSURL *nsURL = [NSURL URLWithString:url];
69
106
  if (!nsURL) {
70
- [self dispatchCallbacksForURL:url image:nil];
107
+ [self dispatchCallbacksForKey:cacheKey image:nil];
71
108
  return;
72
109
  }
73
110
 
74
- [[_session dataTaskWithURL:nsURL
75
- completionHandler:^(NSData *data, NSURLResponse *response, NSError *error) {
111
+ NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:nsURL];
112
+ [headers enumerateKeysAndObjectsUsingBlock:^(NSString *name, NSString *value, BOOL *stop) {
113
+ [request setValue:value forHTTPHeaderField:name];
114
+ }];
115
+
116
+ [[_session dataTaskWithRequest:request
117
+ completionHandler:^(NSData *data, NSURLResponse *response, NSError *error) {
76
118
  #if !TARGET_OS_OSX
77
- RCTUIImage *image = (data && !error) ? [RCTUIImage imageWithData:data] : nil;
119
+ RCTUIImage *image = (data && !error) ? [RCTUIImage imageWithData:data] : nil;
78
120
  #else
79
121
  RCTUIImage *image = (data && !error) ? [[RCTUIImage alloc] initWithData:data] : nil;
80
122
  #endif
81
123
 
82
- if (image) {
83
- [[ENRMImageAttachment originalImageCache] setObject:image forKey:url cost:ENRMImageByteCost(image)];
84
- }
124
+ if (image) {
125
+ [[ENRMImageAttachment originalImageCache] setObject:image
126
+ forKey:cacheKey
127
+ cost:ENRMImageByteCost(image)];
128
+ }
85
129
 
86
- [self dispatchCallbacksForURL:url image:image];
87
- }] resume];
130
+ [self dispatchCallbacksForKey:cacheKey image:image];
131
+ }] resume];
88
132
  }
89
133
 
90
- - (void)dispatchCallbacksForURL:(NSString *)url image:(RCTUIImage *_Nullable)image
134
+ - (void)dispatchCallbacksForKey:(NSString *)cacheKey image:(RCTUIImage *_Nullable)image
91
135
  {
92
136
  NSArray<ENRMImageDownloadCompletion> *callbacks;
93
137
  @synchronized(_inFlightRequests) {
94
- callbacks = [_inFlightRequests[url] copy];
95
- [_inFlightRequests removeObjectForKey:url];
138
+ callbacks = [_inFlightRequests[cacheKey] copy];
139
+ [_inFlightRequests removeObjectForKey:cacheKey];
96
140
  }
97
141
 
98
142
  if (!callbacks)
@@ -0,0 +1,70 @@
1
+ #pragma once
2
+ #import "ENRMUIKit.h"
3
+
4
+ NS_ASSUME_NONNULL_BEGIN
5
+
6
+ /// Marks a link range that carries chip styling. The value is one
7
+ /// `ENRMLinkChip` instance per link: instances compare by identity, so two
8
+ /// adjacent links never coalesce into one attribute run (one chip).
9
+ extern NSString *const ENRMLinkChipAttributeName;
10
+
11
+ /// Marks the spacer characters `LinkRenderer` inserts at both outer edges of a
12
+ /// link to reserve `paddingHorizontal` in the line. Spacers are layout-only:
13
+ /// every text exit point (copy, markdown/HTML export, decoration text) strips
14
+ /// them by this attribute — never by character, since U+00A0 can be content.
15
+ extern NSString *const ENRMLinkSpacerAttributeName;
16
+
17
+ @interface ENRMLinkChip : NSObject
18
+ @property (nonatomic, strong, nullable) RCTUIColor *backgroundColor;
19
+ @property (nonatomic, strong, nullable) RCTUIColor *borderColor;
20
+ @property (nonatomic, assign) CGFloat borderWidth;
21
+ @property (nonatomic, assign) CGFloat borderRadius;
22
+ @property (nonatomic, assign) CGFloat paddingHorizontal;
23
+ @property (nonatomic, assign) CGFloat paddingVertical;
24
+ /// YES when the chip paints something (a background or a visible border).
25
+ @property (nonatomic, readonly) BOOL isVisible;
26
+ @end
27
+
28
+ #ifdef __cplusplus
29
+ extern "C" {
30
+ #endif
31
+
32
+ /// A spacer character (U+00A0) whose advance is exactly `width`.
33
+ ///
34
+ /// U+00A0 is line-break class GL: a break is allowed before it after a space
35
+ /// but never after it, and never before it after a non-space — so a leading
36
+ /// spacer always travels with the link's first glyph and a trailing one with
37
+ /// its last glyph (no orphaned padding at a wrap). It uses a 1pt system font
38
+ /// so its own advance and line-height contribution are negligible whatever
39
+ /// the link font (a custom font may lack U+00A0), and NSKern makes up the rest.
40
+ NSAttributedString *ENRMLinkSpacerString(NSDictionary<NSAttributedStringKey, id> *baseAttributes, CGFloat width);
41
+
42
+ /// `string` without link spacers (returns `string` itself when it has none).
43
+ NSAttributedString *ENRMAttributedStringByRemovingLinkSpacers(NSAttributedString *string);
44
+
45
+ /// Plain text of `range` without link spacers.
46
+ NSString *ENRMPlainTextByRemovingLinkSpacers(NSAttributedString *string, NSRange range);
47
+
48
+ /// Falls back to a plain `NSBackgroundColorAttributeName` for every chip
49
+ /// background, for text drawn without `TextViewLayoutManager` (table cells,
50
+ /// RTF export). Radius, border and vertical padding are not represented.
51
+ void ENRMApplyLinkChipBackgroundsAsTextBackground(NSMutableAttributedString *string);
52
+
53
+ /// Enumerates the chip rect of every laid-out line fragment of the link at
54
+ /// `charRange`, in text-container coordinates. The rect spans the glyphs
55
+ /// (spacers included, so it already covers `paddingHorizontal`) horizontally
56
+ /// and the link font's ascender..descender ± `paddingVertical` vertically.
57
+ void ENRMEnumerateLinkChipFragments(NSLayoutManager *layoutManager, NSTextContainer *textContainer, NSRange charRange,
58
+ ENRMLinkChip *_Nullable chip,
59
+ void (^block)(CGRect rect, BOOL isFirst, BOOL isLast));
60
+
61
+ /// Draws the visible link chips intersecting `glyphsToShow`. Called from the
62
+ /// layout manager's background pass, before glyphs are drawn.
63
+ void ENRMDrawLinkChipsForGlyphRange(NSLayoutManager *layoutManager, NSTextContainer *textContainer,
64
+ NSRange glyphsToShow, CGPoint origin);
65
+
66
+ #ifdef __cplusplus
67
+ }
68
+ #endif
69
+
70
+ NS_ASSUME_NONNULL_END