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

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 (469) hide show
  1. package/README.md +54 -8
  2. package/ReactNativeEnrichedMarkdown.podspec +82 -73
  3. package/android/build.gradle +186 -1
  4. package/android/consumer-rules.pro +1 -1
  5. package/android/generated/java/com/facebook/react/viewmanagers/EnrichedMarkdownManagerDelegate.java +9 -0
  6. package/android/generated/java/com/facebook/react/viewmanagers/EnrichedMarkdownManagerInterface.java +3 -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 +9 -0
  10. package/android/generated/java/com/facebook/react/viewmanagers/EnrichedMarkdownTextManagerInterface.java +3 -0
  11. package/android/generated/jni/react/renderer/components/EnrichedMarkdownTextSpec/EventEmitters.cpp +75 -0
  12. package/android/generated/jni/react/renderer/components/EnrichedMarkdownTextSpec/EventEmitters.h +63 -0
  13. package/android/generated/jni/react/renderer/components/EnrichedMarkdownTextSpec/Props.cpp +35 -0
  14. package/android/generated/jni/react/renderer/components/EnrichedMarkdownTextSpec/Props.h +886 -23
  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 +189 -13
  18. package/android/src/main/java/com/swmansion/enriched/markdown/EnrichedMarkdownInternalText.kt +17 -0
  19. package/android/src/main/java/com/swmansion/enriched/markdown/EnrichedMarkdownManager.kt +50 -0
  20. package/android/src/main/java/com/swmansion/enriched/markdown/EnrichedMarkdownText.kt +48 -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 +42 -0
  23. package/android/src/main/java/com/swmansion/enriched/markdown/MeasurementStore.kt +82 -4
  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/input/EnrichedMarkdownTextInputManager.kt +54 -4
  26. package/android/src/main/java/com/swmansion/enriched/markdown/input/EnrichedMarkdownTextInputView.kt +901 -462
  27. package/android/src/main/java/com/swmansion/enriched/markdown/input/MarkdownClipboard.kt +42 -0
  28. package/android/src/main/java/com/swmansion/enriched/markdown/input/editing/BlockEditCoordinator.kt +196 -0
  29. package/android/src/main/java/com/swmansion/enriched/markdown/input/editing/ClipboardCoordinator.kt +73 -0
  30. package/android/src/main/java/com/swmansion/enriched/markdown/input/editing/EditContext.kt +19 -0
  31. package/android/src/main/java/com/swmansion/enriched/markdown/input/editing/EditPipeline.kt +248 -0
  32. package/android/src/main/java/com/swmansion/enriched/markdown/input/editing/EditSession.kt +52 -0
  33. package/android/src/main/java/com/swmansion/enriched/markdown/input/editing/InputConnectionWrapper.kt +101 -7
  34. package/android/src/main/java/com/swmansion/enriched/markdown/input/editing/LinkCoordinator.kt +69 -0
  35. package/android/src/main/java/com/swmansion/enriched/markdown/input/editing/MarkdownTextWatcher.kt +3 -3
  36. package/android/src/main/java/com/swmansion/enriched/markdown/input/editing/MentionCoordinator.kt +118 -0
  37. package/android/src/main/java/com/swmansion/enriched/markdown/input/events/OnChangeStateEvent.kt +26 -0
  38. package/android/src/main/java/com/swmansion/enriched/markdown/input/events/OnContextMenuItemPressEvent.kt +26 -0
  39. package/android/src/main/java/com/swmansion/enriched/markdown/input/events/OnInputKeyPressEvent.kt +24 -0
  40. package/android/src/main/java/com/swmansion/enriched/markdown/input/events/OnPasteEvent.kt +24 -0
  41. package/android/src/main/java/com/swmansion/enriched/markdown/input/formatting/BlockStore.kt +254 -0
  42. package/android/src/main/java/com/swmansion/enriched/markdown/input/formatting/FormattingStore.kt +80 -87
  43. package/android/src/main/java/com/swmansion/enriched/markdown/input/formatting/InputFormatter.kt +109 -1
  44. package/android/src/main/java/com/swmansion/enriched/markdown/input/formatting/InputParser.kt +116 -22
  45. package/android/src/main/java/com/swmansion/enriched/markdown/input/formatting/MarkdownSerializer.kt +167 -38
  46. package/android/src/main/java/com/swmansion/enriched/markdown/input/formatting/RangeEditAdjustment.kt +149 -0
  47. package/android/src/main/java/com/swmansion/enriched/markdown/input/layout/InputEventEmitter.kt +66 -5
  48. package/android/src/main/java/com/swmansion/enriched/markdown/input/layout/InputMeasurementStore.kt +4 -2
  49. package/android/src/main/java/com/swmansion/enriched/markdown/input/model/BlockRange.kt +27 -0
  50. package/android/src/main/java/com/swmansion/enriched/markdown/input/model/BlockType.kt +48 -0
  51. package/android/src/main/java/com/swmansion/enriched/markdown/input/model/FormattingRange.kt +9 -4
  52. package/android/src/main/java/com/swmansion/enriched/markdown/input/model/InputFormatterStyle.kt +39 -2
  53. package/android/src/main/java/com/swmansion/enriched/markdown/input/model/MathAtom.kt +20 -0
  54. package/android/src/main/java/com/swmansion/enriched/markdown/input/model/MathChipStyle.kt +1 -1
  55. package/android/src/main/java/com/swmansion/enriched/markdown/input/model/MutableRangeBounds.kt +11 -0
  56. package/android/src/main/java/com/swmansion/enriched/markdown/input/spans/InputBulletSpan.kt +82 -0
  57. package/android/src/main/java/com/swmansion/enriched/markdown/input/spans/InputHeadingSpan.kt +58 -0
  58. package/android/src/main/java/com/swmansion/enriched/markdown/input/spans/InputListItemSpacingSpan.kt +37 -0
  59. package/android/src/main/java/com/swmansion/enriched/markdown/input/spans/InputOrderedListMarkerSpan.kt +63 -0
  60. package/android/src/main/java/com/swmansion/enriched/markdown/input/styles/BlockHandler.kt +54 -0
  61. package/android/src/main/java/com/swmansion/enriched/markdown/input/styles/HeadingBlockHandler.kt +27 -0
  62. package/android/src/main/java/com/swmansion/enriched/markdown/input/styles/OrderedListBlockHandler.kt +38 -0
  63. package/android/src/main/java/com/swmansion/enriched/markdown/input/styles/UnorderedListBlockHandler.kt +37 -0
  64. package/android/src/main/java/com/swmansion/enriched/markdown/input/toolbar/InputContextMenu.kt +8 -26
  65. package/android/src/main/java/com/swmansion/enriched/markdown/parser/MarkdownASTNode.kt +1 -0
  66. package/android/src/main/java/com/swmansion/enriched/markdown/parser/Parser.kt +1 -0
  67. package/android/src/main/java/com/swmansion/enriched/markdown/renderer/BlockStyleContext.kt +9 -2
  68. package/android/src/main/java/com/swmansion/enriched/markdown/renderer/BlockquoteRenderer.kt +100 -12
  69. package/android/src/main/java/com/swmansion/enriched/markdown/renderer/CodeBlockRenderer.kt +16 -1
  70. package/android/src/main/java/com/swmansion/enriched/markdown/renderer/HeadingRenderer.kt +4 -0
  71. package/android/src/main/java/com/swmansion/enriched/markdown/renderer/ListContextManager.kt +2 -1
  72. package/android/src/main/java/com/swmansion/enriched/markdown/renderer/ListItemRenderer.kt +74 -18
  73. package/android/src/main/java/com/swmansion/enriched/markdown/renderer/ListRenderer.kt +43 -4
  74. package/android/src/main/java/com/swmansion/enriched/markdown/renderer/NodeRenderer.kt +9 -1
  75. package/android/src/main/java/com/swmansion/enriched/markdown/renderer/SoftBreakRenderer.kt +16 -0
  76. package/android/src/main/java/com/swmansion/enriched/markdown/renderer/SpanStyleCache.kt +30 -27
  77. package/android/src/main/java/com/swmansion/enriched/markdown/spans/BaseListSpan.kt +24 -0
  78. package/android/src/main/java/com/swmansion/enriched/markdown/spans/BlockquoteSpan.kt +174 -24
  79. package/android/src/main/java/com/swmansion/enriched/markdown/spans/CodeBackgroundSpan.kt +27 -3
  80. package/android/src/main/java/com/swmansion/enriched/markdown/spans/CodeBlockSpan.kt +13 -16
  81. package/android/src/main/java/com/swmansion/enriched/markdown/spans/CodeSpan.kt +1 -1
  82. package/android/src/main/java/com/swmansion/enriched/markdown/spans/EmphasisSpan.kt +1 -1
  83. package/android/src/main/java/com/swmansion/enriched/markdown/spans/ImageSpan.kt +182 -46
  84. package/android/src/main/java/com/swmansion/enriched/markdown/spans/ListItemSpacingSpan.kt +33 -0
  85. package/android/src/main/java/com/swmansion/enriched/markdown/spans/ListMarkerAnchorSpan.kt +38 -0
  86. package/android/src/main/java/com/swmansion/enriched/markdown/spans/OrderedListSpan.kt +2 -0
  87. package/android/src/main/java/com/swmansion/enriched/markdown/spans/StrongSpan.kt +1 -1
  88. package/android/src/main/java/com/swmansion/enriched/markdown/spans/TaskListSpan.kt +3 -2
  89. package/android/src/main/java/com/swmansion/enriched/markdown/spans/UnorderedListSpan.kt +3 -2
  90. package/android/src/main/java/com/swmansion/enriched/markdown/styles/BlockquoteStyle.kt +6 -0
  91. package/android/src/main/java/com/swmansion/enriched/markdown/styles/CodeBlockStyle.kt +26 -0
  92. package/android/src/main/java/com/swmansion/enriched/markdown/styles/ImageStyle.kt +7 -1
  93. package/android/src/main/java/com/swmansion/enriched/markdown/styles/ListStyle.kt +4 -1
  94. package/android/src/main/java/com/swmansion/enriched/markdown/styles/StyleConfig.kt +13 -4
  95. package/android/src/main/java/com/swmansion/enriched/markdown/styles/TableStyle.kt +6 -0
  96. package/android/src/main/java/com/swmansion/enriched/markdown/utils/common/CodeBlockHighlighter.kt +90 -0
  97. package/android/src/main/java/com/swmansion/enriched/markdown/utils/common/CodeBlockNode.kt +57 -0
  98. package/android/src/main/java/com/swmansion/enriched/markdown/utils/common/FeatureFlags.kt +1 -0
  99. package/android/src/main/java/com/swmansion/enriched/markdown/utils/common/MarkdownSegment.kt +9 -0
  100. package/android/src/main/java/com/swmansion/enriched/markdown/utils/common/MarkdownViewManagerUtils.kt +37 -7
  101. package/android/src/main/java/com/swmansion/enriched/markdown/utils/common/ReadableMapExtensions.kt +3 -0
  102. package/android/src/main/java/com/swmansion/enriched/markdown/utils/common/RenderedSegment.kt +10 -0
  103. package/android/src/main/java/com/swmansion/enriched/markdown/utils/common/SegmentSignature.kt +1 -0
  104. package/android/src/main/java/com/swmansion/enriched/markdown/utils/common/StreamingMarkdownFilter.kt +83 -5
  105. package/android/src/main/java/com/swmansion/enriched/markdown/utils/common/serialization/MarkdownASTSerializer.kt +4 -0
  106. package/android/src/main/java/com/swmansion/enriched/markdown/utils/input/MarkdownStyleParser.kt +74 -44
  107. package/android/src/main/java/com/swmansion/enriched/markdown/utils/input/PasteTextUtils.kt +20 -0
  108. package/android/src/main/java/com/swmansion/enriched/markdown/utils/text/ImageCache.kt +26 -3
  109. package/android/src/main/java/com/swmansion/enriched/markdown/utils/text/ImageDownloader.kt +22 -9
  110. package/android/src/main/java/com/swmansion/enriched/markdown/utils/text/LocalImageLoader.kt +161 -0
  111. package/android/src/main/java/com/swmansion/enriched/markdown/utils/text/extensions/TextPaintExtensions.kt +23 -0
  112. package/android/src/main/java/com/swmansion/enriched/markdown/utils/text/interaction/CheckboxTouchHelper.kt +7 -0
  113. package/android/src/main/java/com/swmansion/enriched/markdown/utils/text/interaction/TaskListTapUtils.kt +41 -21
  114. package/android/src/main/java/com/swmansion/enriched/markdown/utils/text/span/BlockSpacing.kt +15 -8
  115. package/android/src/main/java/com/swmansion/enriched/markdown/utils/text/view/LinkLongPressMovementMethod.kt +58 -27
  116. package/android/src/main/java/com/swmansion/enriched/markdown/utils/text/view/SelectionActionMode.kt +49 -15
  117. package/android/src/main/java/com/swmansion/enriched/markdown/views/BlockMenuOptions.kt +45 -0
  118. package/android/src/main/java/com/swmansion/enriched/markdown/views/CodeBlockContainerView.kt +396 -0
  119. package/android/src/main/java/com/swmansion/enriched/markdown/views/ContextMenuPopup.kt +9 -6
  120. package/android/src/main/java/com/swmansion/enriched/markdown/views/CopyGlyph.kt +101 -0
  121. package/android/src/main/java/com/swmansion/enriched/markdown/views/TableContainerView.kt +36 -9
  122. package/android/src/main/jni/CMakeLists.txt +53 -0
  123. package/android/src/main/jni/react/renderer/components/EnrichedMarkdownTextSpec/MarkdownContainerShadowNode.cpp +10 -0
  124. package/android/src/main/jni/react/renderer/components/EnrichedMarkdownTextSpec/MarkdownContainerShadowNode.h +11 -2
  125. package/android/src/main/jni/react/renderer/components/EnrichedMarkdownTextSpec/MarkdownTextShadowNode.cpp +10 -0
  126. package/android/src/main/jni/react/renderer/components/EnrichedMarkdownTextSpec/MarkdownTextShadowNode.h +12 -2
  127. package/android/src/main/jni/react/renderer/components/EnrichedMarkdownTextSpec/MarkdownTextState.cpp +9 -0
  128. package/android/src/main/jni/react/renderer/components/EnrichedMarkdownTextSpec/MarkdownTextState.h +24 -0
  129. package/android/src/main/jni/react/renderer/components/EnrichedMarkdownTextSpec/conversions.h +16 -0
  130. package/android/src/math/java/com/swmansion/enriched/markdown/input/math/MathChipControllerImpl.kt +21 -4
  131. package/android/src/math/java/com/swmansion/enriched/markdown/renderer/MathInlineRenderer.kt +7 -2
  132. package/android/src/math/java/com/swmansion/enriched/markdown/spans/MathChipSpan.kt +1 -1
  133. package/android/src/math/java/com/swmansion/enriched/markdown/views/MathContainerView.kt +6 -4
  134. package/cpp/highlight/CodeBlockHighlighter.cpp +284 -0
  135. package/cpp/highlight/CodeBlockHighlighter.hpp +66 -0
  136. package/cpp/highlight/CodeBlockLanguages.cpp +138 -0
  137. package/cpp/highlight/CodeBlockLanguages.hpp +25 -0
  138. package/cpp/highlight/HighlightGrammars.hpp +28 -0
  139. package/cpp/highlight/code_highlight_podspec.rb +211 -0
  140. package/cpp/highlight/gen-registry.mjs +155 -0
  141. package/cpp/highlight/grammar-versions.json +159 -0
  142. package/cpp/highlight/vendor/generated/generated_queries.h +1665 -0
  143. package/cpp/highlight/vendor/generated/generated_registry.cpp +59 -0
  144. package/cpp/parser/MD4CParser.cpp +173 -61
  145. package/cpp/parser/MD4CParser.hpp +1 -0
  146. package/cpp/parser/MarkdownASTNode.hpp +2 -1
  147. package/cpp/wasm/ASTSerializer.cpp +2 -0
  148. package/cpp/wasm/build.sh +1 -0
  149. package/cpp/wasm/md4c_wasm.cpp +3 -1
  150. package/docs/ACCESSIBILITY.md +14 -2
  151. package/docs/API_REFERENCE.md +234 -12
  152. package/docs/BREAKING_CHANGES.md +129 -0
  153. package/docs/CODE_HIGHLIGHT.md +133 -0
  154. package/docs/COPY_OPTIONS.md +47 -3
  155. package/docs/ELEMENTS_STRUCTURE.md +52 -4
  156. package/docs/IMAGE_CACHING.md +30 -0
  157. package/docs/INPUT.md +108 -11
  158. package/docs/LATEX_MATH.md +87 -45
  159. package/docs/MACOS.md +1 -1
  160. package/docs/MARKDOWN_STREAMING.md +27 -1
  161. package/docs/NATIVE_ASSETS.md +127 -0
  162. package/docs/RTL.md +1 -1
  163. package/docs/STYLES.md +46 -6
  164. package/docs/TESTING.md +112 -0
  165. package/docs/TEXT.md +16 -6
  166. package/docs/WEB.md +3 -1
  167. package/ios/EnrichedMarkdown.h +7 -0
  168. package/ios/EnrichedMarkdown.mm +284 -75
  169. package/ios/EnrichedMarkdownText.h +7 -0
  170. package/ios/EnrichedMarkdownText.mm +101 -73
  171. package/ios/attachments/ENRMImageAttachment.h +9 -0
  172. package/ios/attachments/ENRMImageAttachment.m +143 -40
  173. package/ios/attachments/ENRMMathInlineAttachment.h +2 -0
  174. package/ios/attachments/ENRMMathInlineAttachment.m +48 -81
  175. package/ios/attachments/ENRMMathInlineAttachmentShared.h +2 -0
  176. package/ios/generated/ReactCodegen/EnrichedMarkdownTextSpec/EventEmitters.cpp +75 -0
  177. package/ios/generated/ReactCodegen/EnrichedMarkdownTextSpec/EventEmitters.h +63 -0
  178. package/ios/generated/ReactCodegen/EnrichedMarkdownTextSpec/Props.cpp +35 -0
  179. package/ios/generated/ReactCodegen/EnrichedMarkdownTextSpec/Props.h +886 -23
  180. package/ios/generated/ReactCodegen/EnrichedMarkdownTextSpec/RCTComponentViewHelpers.h +131 -0
  181. package/ios/input/ENRMAutoLinkDetector.h +2 -1
  182. package/ios/input/ENRMAutoLinkDetector.mm +79 -41
  183. package/ios/input/ENRMBlockEditCoordinator.h +71 -0
  184. package/ios/input/ENRMBlockEditCoordinator.mm +195 -0
  185. package/ios/input/ENRMBlockRange.h +28 -0
  186. package/ios/input/ENRMBlockRange.mm +30 -0
  187. package/ios/input/ENRMBlockStore.h +56 -0
  188. package/ios/input/ENRMBlockStore.mm +275 -0
  189. package/ios/input/ENRMClipboardCoordinator.h +45 -0
  190. package/ios/input/ENRMClipboardCoordinator.mm +120 -0
  191. package/ios/input/ENRMDetectorPipeline.h +2 -1
  192. package/ios/input/ENRMEditPipeline.h +76 -0
  193. package/ios/input/ENRMEditPipeline.mm +228 -0
  194. package/ios/input/ENRMEditSession.h +36 -0
  195. package/ios/input/ENRMEditSession.mm +63 -0
  196. package/ios/input/ENRMFormattingStore.h +17 -0
  197. package/ios/input/ENRMFormattingStore.mm +95 -105
  198. package/ios/input/ENRMInputBlockType.h +91 -0
  199. package/ios/input/ENRMInputBlockType.mm +5 -0
  200. package/ios/input/ENRMInputDecorationDrawer.h +18 -0
  201. package/ios/input/ENRMInputEventEmitter.h +56 -0
  202. package/ios/input/ENRMInputEventEmitter.mm +308 -0
  203. package/ios/input/ENRMInputFormatter.h +29 -69
  204. package/ios/input/ENRMInputFormatter.mm +216 -124
  205. package/ios/input/ENRMInputFormatterStyle.h +99 -0
  206. package/ios/input/ENRMInputFormatterStyle.mm +188 -0
  207. package/ios/input/ENRMInputLayoutManager.h +9 -0
  208. package/ios/input/ENRMInputLayoutManager.mm +30 -0
  209. package/ios/input/ENRMInputListMarkerDrawer.h +32 -0
  210. package/ios/input/ENRMInputListMarkerDrawer.mm +426 -0
  211. package/ios/input/ENRMInputParser.h +5 -6
  212. package/ios/input/ENRMInputParser.mm +461 -178
  213. package/ios/input/ENRMInputRemend.mm +2 -2
  214. package/ios/input/ENRMInputStyleStateBuilder.h +40 -0
  215. package/ios/input/ENRMInputStyleStateBuilder.mm +60 -0
  216. package/ios/input/ENRMInputTextView.mm +103 -8
  217. package/ios/input/ENRMInputTypingAttributesController.h +42 -0
  218. package/ios/input/ENRMInputTypingAttributesController.mm +203 -0
  219. package/ios/input/ENRMLinkCoordinator.h +41 -0
  220. package/ios/input/ENRMLinkCoordinator.mm +89 -0
  221. package/ios/input/ENRMMarkdownSerializer.h +29 -5
  222. package/ios/input/ENRMMarkdownSerializer.mm +170 -48
  223. package/ios/input/ENRMMathAtom.h +26 -0
  224. package/ios/input/ENRMMathAtom.mm +12 -0
  225. package/ios/input/ENRMMentionCoordinator.h +45 -0
  226. package/ios/input/ENRMMentionCoordinator.mm +167 -0
  227. package/ios/input/ENRMRangeEditAdjustment.h +38 -0
  228. package/ios/input/ENRMRangeEditAdjustment.mm +91 -0
  229. package/ios/input/ENRMRangeStoreUtils.h +39 -0
  230. package/ios/input/EnrichedMarkdownTextInput+ContextMenu.mm +6 -6
  231. package/ios/input/EnrichedMarkdownTextInput+Internal.h +11 -3
  232. package/ios/input/EnrichedMarkdownTextInput.h +7 -1
  233. package/ios/input/EnrichedMarkdownTextInput.mm +1089 -1023
  234. package/ios/input/InputStylePropsUtils.h +109 -68
  235. package/ios/input/internals/EnrichedMarkdownTextInputShadowNode.mm +2 -1
  236. package/ios/input/styles/ENRMBlockHandler.h +46 -0
  237. package/ios/input/styles/ENRMHeadingBlockHandler.h +15 -0
  238. package/ios/input/styles/ENRMHeadingBlockHandler.mm +38 -0
  239. package/ios/input/styles/ENRMOrderedListBlockHandler.h +14 -0
  240. package/ios/input/styles/ENRMOrderedListBlockHandler.mm +48 -0
  241. package/ios/input/styles/ENRMUnorderedListBlockHandler.h +15 -0
  242. package/ios/input/styles/ENRMUnorderedListBlockHandler.mm +51 -0
  243. package/ios/internals/ENRMViewFreeMeasurement.h +331 -0
  244. package/ios/internals/EnrichedMarkdownShadowNode.h +1 -3
  245. package/ios/internals/EnrichedMarkdownShadowNode.mm +16 -20
  246. package/ios/internals/EnrichedMarkdownTextShadowNode.h +1 -3
  247. package/ios/internals/EnrichedMarkdownTextShadowNode.mm +15 -20
  248. package/ios/internals/MeasurementCache.h +33 -7
  249. package/ios/internals/ShadowMeasurementUtils.h +63 -58
  250. package/ios/math/ENRMMathChipController.h +74 -0
  251. package/ios/math/ENRMMathChipController.mm +476 -0
  252. package/ios/math/ENRMRaTeXBridge.swift +4 -1
  253. package/ios/parser/ENRMMarkdownParser.h +1 -8
  254. package/ios/parser/ENRMMarkdownParser.mm +2 -11
  255. package/ios/parser/MarkdownASTNode.h +2 -1
  256. package/ios/parser/MarkdownParserBridge.mm +4 -0
  257. package/ios/renderer/AttributedRenderer.m +20 -2
  258. package/ios/renderer/BaseRenderer.h +17 -2
  259. package/ios/renderer/BaseRenderer.m +30 -0
  260. package/ios/renderer/BlockquoteRenderer.h +1 -1
  261. package/ios/renderer/BlockquoteRenderer.m +144 -35
  262. package/ios/renderer/CodeBlockRenderer.h +1 -1
  263. package/ios/renderer/CodeBlockRenderer.m +27 -23
  264. package/ios/renderer/CodeRenderer.h +1 -1
  265. package/ios/renderer/CodeRenderer.m +3 -1
  266. package/ios/renderer/ENRMImageRenderer.h +1 -1
  267. package/ios/renderer/ENRMImageRenderer.m +5 -1
  268. package/ios/renderer/ENRMMathInlineRenderer.h +1 -1
  269. package/ios/renderer/ENRMMathInlineRenderer.m +5 -1
  270. package/ios/renderer/ENRMSpoilerRenderer.h +1 -1
  271. package/ios/renderer/ENRMSpoilerRenderer.m +3 -1
  272. package/ios/renderer/EmphasisRenderer.h +1 -1
  273. package/ios/renderer/EmphasisRenderer.m +3 -1
  274. package/ios/renderer/HeadingRenderer.h +1 -1
  275. package/ios/renderer/HeadingRenderer.m +13 -6
  276. package/ios/renderer/HighlightRenderer.h +1 -1
  277. package/ios/renderer/HighlightRenderer.m +3 -1
  278. package/ios/renderer/LinkRenderer.h +1 -1
  279. package/ios/renderer/LinkRenderer.m +3 -1
  280. package/ios/renderer/ListItemRenderer.h +13 -1
  281. package/ios/renderer/ListItemRenderer.m +102 -44
  282. package/ios/renderer/ListRenderer.h +2 -2
  283. package/ios/renderer/ListRenderer.m +63 -25
  284. package/ios/renderer/ParagraphRenderer.h +1 -1
  285. package/ios/renderer/ParagraphRenderer.m +16 -8
  286. package/ios/renderer/RenderContext.h +10 -0
  287. package/ios/renderer/RenderContext.m +44 -0
  288. package/ios/renderer/RendererFactory.m +14 -0
  289. package/ios/renderer/StrikethroughRenderer.h +1 -1
  290. package/ios/renderer/StrikethroughRenderer.m +3 -1
  291. package/ios/renderer/StrongRenderer.h +1 -1
  292. package/ios/renderer/StrongRenderer.m +3 -1
  293. package/ios/renderer/SubscriptRenderer.h +1 -1
  294. package/ios/renderer/SubscriptRenderer.m +3 -1
  295. package/ios/renderer/SuperscriptRenderer.h +1 -1
  296. package/ios/renderer/SuperscriptRenderer.m +3 -1
  297. package/ios/renderer/TextRenderer.h +2 -2
  298. package/ios/renderer/TextRenderer.m +3 -1
  299. package/ios/renderer/ThematicBreakRenderer.h +1 -1
  300. package/ios/renderer/ThematicBreakRenderer.m +3 -1
  301. package/ios/renderer/UnderlineRenderer.h +1 -1
  302. package/ios/renderer/UnderlineRenderer.m +3 -1
  303. package/ios/styles/StyleConfig.h +22 -0
  304. package/ios/styles/StyleConfig.mm +132 -0
  305. package/ios/utils/BlockquoteBorder.h +6 -0
  306. package/ios/utils/BlockquoteBorder.m +249 -52
  307. package/ios/utils/CodeBlockBackground.m +16 -2
  308. package/ios/utils/ENRMAtomicSize.h +65 -0
  309. package/ios/utils/ENRMBlockMenu.h +57 -0
  310. package/ios/utils/ENRMCodeBlockContent.h +37 -0
  311. package/ios/utils/ENRMCodeBlockContent.mm +79 -0
  312. package/ios/utils/ENRMCodeBlockHighlighter.h +37 -0
  313. package/ios/utils/ENRMCodeBlockHighlighter.mm +51 -0
  314. package/ios/utils/ENRMFeatureFlags.h +7 -0
  315. package/ios/utils/ENRMImageDownloader.h +11 -1
  316. package/ios/utils/ENRMImageDownloader.m +60 -16
  317. package/ios/utils/ENRMLocalImageLoader.h +31 -0
  318. package/ios/utils/ENRMLocalImageLoader.m +68 -0
  319. package/ios/utils/ENRMMathFallback.h +26 -0
  320. package/ios/utils/ENRMMathFallback.m +18 -0
  321. package/ios/utils/ENRMTextViewSetup.h +35 -17
  322. package/ios/utils/EditMenuUtils.h +22 -5
  323. package/ios/utils/EditMenuUtils.m +53 -9
  324. package/ios/utils/ImageRequestHeaderUtils.h +35 -0
  325. package/ios/utils/LastElementUtils.h +1 -0
  326. package/ios/utils/ListMarkerDrawer.m +29 -42
  327. package/ios/utils/MarkdownASTSerializer.m +4 -0
  328. package/ios/utils/ParagraphStyleUtils.h +5 -0
  329. package/ios/utils/ParagraphStyleUtils.m +77 -17
  330. package/ios/utils/RenderedMarkdownSegment.h +13 -1
  331. package/ios/utils/RenderedMarkdownSegment.m +20 -0
  332. package/ios/utils/SegmentRenderer.m +17 -4
  333. package/ios/utils/StreamingMarkdownFilter.h +11 -1
  334. package/ios/utils/StreamingMarkdownFilter.m +98 -2
  335. package/ios/utils/StylePropsUtils.h +63 -0
  336. package/ios/utils/TaskListTapUtils.m +24 -0
  337. package/ios/views/ENRMCodeBlockContainerView.h +53 -0
  338. package/ios/views/ENRMCodeBlockContainerView.m +559 -0
  339. package/ios/views/ENRMMathContainerView.h +16 -0
  340. package/ios/views/ENRMMathContainerView.m +74 -19
  341. package/ios/views/TableContainerView.h +22 -0
  342. package/ios/views/TableContainerView.m +261 -175
  343. package/jest.d.ts +1 -0
  344. package/jest.js +5 -0
  345. package/lib/module/EnrichedMarkdownNativeComponent.ts +73 -0
  346. package/lib/module/EnrichedMarkdownTextInput.js +84 -5
  347. package/lib/module/EnrichedMarkdownTextInput.js.map +1 -1
  348. package/lib/module/EnrichedMarkdownTextInputNativeComponent.ts +78 -5
  349. package/lib/module/EnrichedMarkdownTextNativeComponent.ts +74 -0
  350. package/lib/module/headingDefaults.js +34 -0
  351. package/lib/module/headingDefaults.js.map +1 -0
  352. package/lib/module/index.js.map +1 -1
  353. package/lib/module/jest/index.js +191 -0
  354. package/lib/module/jest/index.js.map +1 -0
  355. package/lib/module/native/EnrichedMarkdownText.js +37 -5
  356. package/lib/module/native/EnrichedMarkdownText.js.map +1 -1
  357. package/lib/module/normalizeMarkdownStyle.js +81 -19
  358. package/lib/module/normalizeMarkdownStyle.js.map +1 -1
  359. package/lib/module/normalizeMarkdownStyle.web.js +56 -18
  360. package/lib/module/normalizeMarkdownStyle.web.js.map +1 -1
  361. package/lib/module/normalizeMarkdownTextInputStyle.js +62 -15
  362. package/lib/module/normalizeMarkdownTextInputStyle.js.map +1 -1
  363. package/lib/module/normalizeMenuItem.js +1 -1
  364. package/lib/module/utils/textInputState.js +26 -0
  365. package/lib/module/utils/textInputState.js.map +1 -0
  366. package/lib/module/web/EnrichedMarkdownText.js +9 -5
  367. package/lib/module/web/EnrichedMarkdownText.js.map +1 -1
  368. package/lib/module/web/parseMarkdown.js +4 -3
  369. package/lib/module/web/parseMarkdown.js.map +1 -1
  370. package/lib/module/web/renderers/InlineRenderers.js +6 -0
  371. package/lib/module/web/renderers/InlineRenderers.js.map +1 -1
  372. package/lib/module/web/renderers/ListRenderers.js +7 -2
  373. package/lib/module/web/renderers/ListRenderers.js.map +1 -1
  374. package/lib/module/web/renderers/index.js +7 -4
  375. package/lib/module/web/renderers/index.js.map +1 -1
  376. package/lib/module/web/styles.js +83 -6
  377. package/lib/module/web/styles.js.map +1 -1
  378. package/lib/module/web/utils.js +1 -0
  379. package/lib/module/web/utils.js.map +1 -1
  380. package/lib/module/web/wasm/md4c.js +0 -0
  381. package/lib/module/web/wasm/md4c.js.map +1 -1
  382. package/lib/typescript/src/EnrichedMarkdownNativeComponent.d.ts +66 -0
  383. package/lib/typescript/src/EnrichedMarkdownNativeComponent.d.ts.map +1 -1
  384. package/lib/typescript/src/EnrichedMarkdownTextInput.d.ts +94 -9
  385. package/lib/typescript/src/EnrichedMarkdownTextInput.d.ts.map +1 -1
  386. package/lib/typescript/src/EnrichedMarkdownTextInputNativeComponent.d.ts +69 -5
  387. package/lib/typescript/src/EnrichedMarkdownTextInputNativeComponent.d.ts.map +1 -1
  388. package/lib/typescript/src/EnrichedMarkdownTextNativeComponent.d.ts +66 -0
  389. package/lib/typescript/src/EnrichedMarkdownTextNativeComponent.d.ts.map +1 -1
  390. package/lib/typescript/src/headingDefaults.d.ts +9 -0
  391. package/lib/typescript/src/headingDefaults.d.ts.map +1 -0
  392. package/lib/typescript/src/index.d.ts +2 -2
  393. package/lib/typescript/src/index.d.ts.map +1 -1
  394. package/lib/typescript/src/index.web.d.ts +1 -1
  395. package/lib/typescript/src/index.web.d.ts.map +1 -1
  396. package/lib/typescript/src/jest/index.d.ts +6 -0
  397. package/lib/typescript/src/jest/index.d.ts.map +1 -0
  398. package/lib/typescript/src/native/EnrichedMarkdownText.d.ts +3 -3
  399. package/lib/typescript/src/native/EnrichedMarkdownText.d.ts.map +1 -1
  400. package/lib/typescript/src/normalizeMarkdownStyle.d.ts.map +1 -1
  401. package/lib/typescript/src/normalizeMarkdownStyle.web.d.ts.map +1 -1
  402. package/lib/typescript/src/normalizeMarkdownTextInputStyle.d.ts +19 -5
  403. package/lib/typescript/src/normalizeMarkdownTextInputStyle.d.ts.map +1 -1
  404. package/lib/typescript/src/types/MarkdownStyle.d.ts +72 -0
  405. package/lib/typescript/src/types/MarkdownStyle.d.ts.map +1 -1
  406. package/lib/typescript/src/types/MarkdownStyleInternal.d.ts +27 -0
  407. package/lib/typescript/src/types/MarkdownStyleInternal.d.ts.map +1 -1
  408. package/lib/typescript/src/types/MarkdownTextProps.d.ts +104 -9
  409. package/lib/typescript/src/types/MarkdownTextProps.d.ts.map +1 -1
  410. package/lib/typescript/src/types/MarkdownTextProps.web.d.ts +19 -0
  411. package/lib/typescript/src/types/MarkdownTextProps.web.d.ts.map +1 -1
  412. package/lib/typescript/src/types/events.d.ts +19 -0
  413. package/lib/typescript/src/types/events.d.ts.map +1 -1
  414. package/lib/typescript/src/utils/textInputState.d.ts +24 -0
  415. package/lib/typescript/src/utils/textInputState.d.ts.map +1 -0
  416. package/lib/typescript/src/web/EnrichedMarkdownText.d.ts +1 -1
  417. package/lib/typescript/src/web/EnrichedMarkdownText.d.ts.map +1 -1
  418. package/lib/typescript/src/web/parseMarkdown.d.ts +1 -1
  419. package/lib/typescript/src/web/parseMarkdown.d.ts.map +1 -1
  420. package/lib/typescript/src/web/renderers/InlineRenderers.d.ts.map +1 -1
  421. package/lib/typescript/src/web/renderers/ListRenderers.d.ts.map +1 -1
  422. package/lib/typescript/src/web/renderers/index.d.ts +2 -1
  423. package/lib/typescript/src/web/renderers/index.d.ts.map +1 -1
  424. package/lib/typescript/src/web/styles.d.ts +2 -1
  425. package/lib/typescript/src/web/styles.d.ts.map +1 -1
  426. package/lib/typescript/src/web/types.d.ts +6 -2
  427. package/lib/typescript/src/web/types.d.ts.map +1 -1
  428. package/lib/typescript/src/web/utils.d.ts.map +1 -1
  429. package/package.json +36 -9
  430. package/postinstall.mjs +131 -0
  431. package/ratex-version.json +21 -0
  432. package/src/EnrichedMarkdownNativeComponent.ts +73 -0
  433. package/src/EnrichedMarkdownTextInput.tsx +159 -8
  434. package/src/EnrichedMarkdownTextInputNativeComponent.ts +78 -5
  435. package/src/EnrichedMarkdownTextNativeComponent.ts +74 -0
  436. package/src/headingDefaults.ts +21 -0
  437. package/src/index.tsx +9 -0
  438. package/src/index.web.tsx +1 -0
  439. package/src/jest/index.tsx +215 -0
  440. package/src/native/EnrichedMarkdownText.tsx +53 -2
  441. package/src/normalizeMarkdownStyle.ts +102 -16
  442. package/src/normalizeMarkdownStyle.web.ts +63 -15
  443. package/src/normalizeMarkdownTextInputStyle.ts +110 -35
  444. package/src/normalizeMenuItem.ts +1 -1
  445. package/src/types/MarkdownStyle.ts +74 -0
  446. package/src/types/MarkdownStyleInternal.ts +39 -0
  447. package/src/types/MarkdownTextProps.ts +101 -9
  448. package/src/types/MarkdownTextProps.web.ts +19 -0
  449. package/src/types/events.ts +21 -0
  450. package/src/utils/textInputState.ts +35 -0
  451. package/src/web/EnrichedMarkdownText.tsx +16 -2
  452. package/src/web/parseMarkdown.ts +6 -2
  453. package/src/web/renderers/InlineRenderers.tsx +5 -0
  454. package/src/web/renderers/ListRenderers.tsx +14 -2
  455. package/src/web/renderers/index.tsx +6 -2
  456. package/src/web/styles.ts +89 -5
  457. package/src/web/types.ts +6 -1
  458. package/src/web/utils.ts +1 -0
  459. package/src/web/wasm/md4c.js +0 -0
  460. package/vendor-grammars.mjs +511 -0
  461. package/vendor-ratex.mjs +173 -0
  462. package/app.plugin.js +0 -2
  463. package/plugin/build/withAndroidMath.js +0 -19
  464. package/plugin/build/withIosMath.js +0 -28
  465. package/plugin/build/withReactNativeEnrichedMarkdown.js +0 -11
  466. package/plugin/src/withAndroidMath.ts +0 -24
  467. package/plugin/src/withIosMath.ts +0 -35
  468. package/plugin/src/withReactNativeEnrichedMarkdown.ts +0 -17
  469. package/plugin/tsconfig.build.json +0 -16
@@ -1,118 +1,19 @@
1
1
  #import "ENRMInputFormatter.h"
2
+ #import "ENRMBlockHandler.h"
2
3
  #import "ENRMBoldStyleHandler.h"
4
+ #import "ENRMHeadingBlockHandler.h"
3
5
  #import "ENRMItalicStyleHandler.h"
4
6
  #import "ENRMLinkStyleHandler.h"
7
+ #import "ENRMOrderedListBlockHandler.h"
5
8
  #import "ENRMSpoilerStyleHandler.h"
6
9
  #import "ENRMStrikethroughStyleHandler.h"
7
10
  #import "ENRMStyleHandler.h"
8
11
  #import "ENRMUnderlineStyleHandler.h"
9
-
10
- @implementation ENRMInputLinkVariantStyle
11
- @end
12
-
13
- @implementation ENRMInputFormatterStyle {
14
- NSMutableDictionary<NSNumber *, UIFont *> *_fontCache;
15
- UIFont *_lastBaseFont;
16
- }
17
-
18
- - (instancetype)init
19
- {
20
- if (self = [super init]) {
21
- _baseFont = [UIFont systemFontOfSize:16.0];
22
- _baseTextColor = [RCTUIColor labelColor];
23
- _linkVariants = @[];
24
- _fontCache = [NSMutableDictionary dictionary];
25
- _mathFontSize = 16.0;
26
- _mathBlockFontSize = 20.0;
27
- _mathBlockPaddingHorizontal = 12.0;
28
- _mathBlockPaddingVertical = 8.0;
29
- _mathBlockMarginTop = 8.0;
30
- _mathBlockMarginBottom = 8.0;
31
- _mathBlockAlignment = NSTextAlignmentCenter;
32
- }
33
- return self;
34
- }
35
-
36
- - (id)copyWithZone:(NSZone *)zone
37
- {
38
- ENRMInputFormatterStyle *copy = [[ENRMInputFormatterStyle allocWithZone:zone] init];
39
- copy.baseFont = _baseFont;
40
- copy.baseTextColor = _baseTextColor;
41
- copy.boldColor = _boldColor;
42
- copy.italicColor = _italicColor;
43
- copy.linkColor = _linkColor;
44
- copy.linkUnderline = _linkUnderline;
45
- copy.linkBackgroundColor = _linkBackgroundColor;
46
- copy.linkVariants = [_linkVariants copy];
47
- copy.spoilerColor = _spoilerColor;
48
- copy.spoilerBackgroundColor = _spoilerBackgroundColor;
49
- copy.mathColor = _mathColor;
50
- copy.mathFontSize = _mathFontSize;
51
- copy.mathBackgroundColor = _mathBackgroundColor;
52
- copy.mathBorderColor = _mathBorderColor;
53
- copy.mathBorderWidth = _mathBorderWidth;
54
- copy.mathBorderRadius = _mathBorderRadius;
55
- copy.mathPaddingHorizontal = _mathPaddingHorizontal;
56
- copy.mathPaddingVertical = _mathPaddingVertical;
57
- copy.mathSelectedBackgroundColor = _mathSelectedBackgroundColor;
58
- copy.mathSelectedBorderColor = _mathSelectedBorderColor;
59
- copy.mathFontWeight = _mathFontWeight;
60
- copy.mathBlockColor = _mathBlockColor;
61
- copy.mathBlockFontSize = _mathBlockFontSize;
62
- copy.mathBlockBackgroundColor = _mathBlockBackgroundColor;
63
- copy.mathBlockBorderColor = _mathBlockBorderColor;
64
- copy.mathBlockBorderWidth = _mathBlockBorderWidth;
65
- copy.mathBlockBorderRadius = _mathBlockBorderRadius;
66
- copy.mathBlockPaddingHorizontal = _mathBlockPaddingHorizontal;
67
- copy.mathBlockPaddingVertical = _mathBlockPaddingVertical;
68
- copy.mathBlockSelectedBackgroundColor = _mathBlockSelectedBackgroundColor;
69
- copy.mathBlockSelectedBorderColor = _mathBlockSelectedBorderColor;
70
- copy.mathBlockMarginTop = _mathBlockMarginTop;
71
- copy.mathBlockMarginBottom = _mathBlockMarginBottom;
72
- copy.mathBlockAlignment = _mathBlockAlignment;
73
- copy.mathBlockFontWeight = _mathBlockFontWeight;
74
- return copy;
75
- }
76
-
77
- - (void)invalidateCacheIfNeeded
78
- {
79
- if (_lastBaseFont != _baseFont) {
80
- [_fontCache removeAllObjects];
81
- _lastBaseFont = _baseFont;
82
- }
83
- }
84
-
85
- - (void)invalidateFontCache
86
- {
87
- [_fontCache removeAllObjects];
88
- _lastBaseFont = nil;
89
- }
90
-
91
- - (UIFont *)fontForTraits:(UIFontDescriptorSymbolicTraits)traits
92
- {
93
- [self invalidateCacheIfNeeded];
94
-
95
- if (traits == 0) {
96
- return _baseFont;
97
- }
98
-
99
- NSNumber *key = @(traits);
100
- UIFont *cached = _fontCache[key];
101
- if (cached) {
102
- return cached;
103
- }
104
-
105
- UIFontDescriptor *descriptor =
106
- [_baseFont.fontDescriptor fontDescriptorWithSymbolicTraits:_baseFont.fontDescriptor.symbolicTraits | traits];
107
- UIFont *derived = descriptor ? [UIFont fontWithDescriptor:descriptor size:0] : _baseFont;
108
- _fontCache[key] = derived;
109
- return derived;
110
- }
111
-
112
- @end
12
+ #import "ENRMUnorderedListBlockHandler.h"
113
13
 
114
14
  @implementation ENRMInputFormatter {
115
15
  NSDictionary<NSNumber *, id<ENRMStyleHandler>> *_styleHandlers;
16
+ NSDictionary<NSNumber *, id<ENRMBlockHandler>> *_blockHandlers;
116
17
  }
117
18
 
118
19
  - (instancetype)init
@@ -131,6 +32,15 @@
131
32
  map[@(handler.styleType)] = handler;
132
33
  }
133
34
  _styleHandlers = [map copy];
35
+
36
+ ENRMHeadingBlockHandler *headingHandler = [[ENRMHeadingBlockHandler alloc] init];
37
+ NSMutableDictionary<NSNumber *, id<ENRMBlockHandler>> *blockMap = [NSMutableDictionary dictionary];
38
+ for (NSInteger level = 1; level <= 6; level++) {
39
+ blockMap[@(ENRMBlockTypeForHeadingLevel(level))] = headingHandler;
40
+ }
41
+ blockMap[@(ENRMInputBlockTypeUnorderedListItem)] = [[ENRMUnorderedListBlockHandler alloc] init];
42
+ blockMap[@(ENRMInputBlockTypeOrderedListItem)] = [[ENRMOrderedListBlockHandler alloc] init];
43
+ _blockHandlers = [blockMap copy];
134
44
  }
135
45
  return self;
136
46
  }
@@ -140,9 +50,25 @@
140
50
  return _styleHandlers[@(type)];
141
51
  }
142
52
 
53
+ - (nullable id<ENRMBlockHandler>)handlerForBlockType:(ENRMInputBlockType)type
54
+ {
55
+ return _blockHandlers[@(type)];
56
+ }
57
+
58
+ - (void)applyFormattingRanges:(NSArray<ENRMFormattingRange *> *)ranges
59
+ toTextView:(ENRMPlatformTextView *)textView
60
+ style:(ENRMInputFormatterStyle *)style
61
+ {
62
+ [self applyFormattingRanges:ranges
63
+ toTextView:textView
64
+ style:style
65
+ scopedToRange:NSMakeRange(0, textView.textStorage.length)];
66
+ }
67
+
143
68
  - (void)applyFormattingRanges:(NSArray<ENRMFormattingRange *> *)ranges
144
69
  toTextView:(ENRMPlatformTextView *)textView
145
70
  style:(ENRMInputFormatterStyle *)style
71
+ scopedToRange:(NSRange)scope
146
72
  {
147
73
  NSTextStorage *textStorage = textView.textStorage;
148
74
  NSUInteger textLength = textStorage.length;
@@ -151,18 +77,24 @@
151
77
  return;
152
78
  }
153
79
 
154
- NSRange fullTextRange = NSMakeRange(0, textLength);
80
+ NSUInteger scopeStart = MIN(scope.location, textLength);
81
+ NSUInteger scopeEnd = MIN(NSMaxRange(scope), textLength);
82
+ if (scopeEnd <= scopeStart) {
83
+ return;
84
+ }
85
+ NSRange scopeRange = NSMakeRange(scopeStart, scopeEnd - scopeStart);
86
+ NSUInteger scopeLength = scopeRange.length;
155
87
 
156
88
  [textStorage beginEditing];
157
89
 
158
- [textStorage addAttribute:NSFontAttributeName value:style.baseFont range:fullTextRange];
159
- [textStorage addAttribute:NSForegroundColorAttributeName value:style.baseTextColor range:fullTextRange];
160
- [textStorage removeAttribute:NSUnderlineStyleAttributeName range:fullTextRange];
161
- [textStorage removeAttribute:NSStrikethroughStyleAttributeName range:fullTextRange];
162
- [textStorage removeAttribute:NSBackgroundColorAttributeName range:fullTextRange];
90
+ [textStorage addAttribute:NSFontAttributeName value:style.baseFont range:scopeRange];
91
+ [textStorage addAttribute:NSForegroundColorAttributeName value:style.baseTextColor range:scopeRange];
92
+ [textStorage removeAttribute:NSUnderlineStyleAttributeName range:scopeRange];
93
+ [textStorage removeAttribute:NSStrikethroughStyleAttributeName range:scopeRange];
94
+ [textStorage removeAttribute:NSBackgroundColorAttributeName range:scopeRange];
163
95
 
164
96
  UIFontDescriptorSymbolicTraits *traitMap =
165
- (UIFontDescriptorSymbolicTraits *)calloc(textLength, sizeof(UIFontDescriptorSymbolicTraits));
97
+ (UIFontDescriptorSymbolicTraits *)calloc(scopeLength, sizeof(UIFontDescriptorSymbolicTraits));
166
98
  if (!traitMap) {
167
99
  [textStorage endEditing];
168
100
  return;
@@ -173,6 +105,13 @@
173
105
  continue;
174
106
  }
175
107
 
108
+ // Ranges straddling the scope boundary are clipped: attributes are
109
+ // per-character and the out-of-scope part is untouched by the reset above.
110
+ NSRange clipped = NSIntersectionRange(formattingRange.range, scopeRange);
111
+ if (clipped.length == 0) {
112
+ continue;
113
+ }
114
+
176
115
  id<ENRMStyleHandler> handler = _styleHandlers[@(formattingRange.type)];
177
116
  if (!handler) {
178
117
  continue;
@@ -180,31 +119,30 @@
180
119
 
181
120
  UIFontDescriptorSymbolicTraits traits = [handler fontTraits];
182
121
  if (traits != 0) {
183
- NSUInteger start = formattingRange.range.location;
184
- NSUInteger end = NSMaxRange(formattingRange.range);
122
+ NSUInteger start = clipped.location;
123
+ NSUInteger end = NSMaxRange(clipped);
185
124
  for (NSUInteger i = start; i < end; i++) {
186
- traitMap[i] |= traits;
125
+ traitMap[i - scopeStart] |= traits;
187
126
  }
188
127
  }
189
128
 
190
- [handler applyNonFontAttributesToTextStorage:textStorage
191
- range:formattingRange.range
192
- formattingRange:formattingRange
193
- style:style];
129
+ [handler applyNonFontAttributesToTextStorage:textStorage range:clipped formattingRange:formattingRange style:style];
194
130
  }
195
131
 
196
132
  NSUInteger runStart = 0;
197
133
  UIFontDescriptorSymbolicTraits currentTraits = traitMap[0];
198
134
 
199
- for (NSUInteger i = 1; i <= textLength; i++) {
200
- UIFontDescriptorSymbolicTraits nextTraits = (i < textLength) ? traitMap[i] : ~currentTraits;
135
+ for (NSUInteger i = 1; i <= scopeLength; i++) {
136
+ UIFontDescriptorSymbolicTraits nextTraits = (i < scopeLength) ? traitMap[i] : ~currentTraits;
201
137
  if (nextTraits != currentTraits) {
202
138
  if (currentTraits != 0) {
203
139
  UIFont *font = [style fontForTraits:currentTraits];
204
- [textStorage addAttribute:NSFontAttributeName value:font range:NSMakeRange(runStart, i - runStart)];
140
+ [textStorage addAttribute:NSFontAttributeName
141
+ value:font
142
+ range:NSMakeRange(scopeStart + runStart, i - runStart)];
205
143
  }
206
144
  runStart = i;
207
- currentTraits = (i < textLength) ? traitMap[i] : 0;
145
+ currentTraits = (i < scopeLength) ? traitMap[i] : 0;
208
146
  }
209
147
  }
210
148
 
@@ -214,11 +152,165 @@
214
152
 
215
153
  NSLayoutManager *layoutManager = textStorage.layoutManagers.firstObject;
216
154
  if (layoutManager) {
217
- [layoutManager invalidateLayoutForCharacterRange:fullTextRange actualCharacterRange:NULL];
218
- [layoutManager ensureLayoutForCharacterRange:fullTextRange];
155
+ [layoutManager invalidateLayoutForCharacterRange:scopeRange actualCharacterRange:NULL];
156
+ [layoutManager ensureLayoutForCharacterRange:scopeRange];
157
+ }
158
+
159
+ ENRMSetNeedsDisplay(textView);
160
+ }
161
+
162
+ - (void)applyBlockRanges:(NSArray<ENRMBlockRange *> *)blockRanges
163
+ toTextView:(ENRMPlatformTextView *)textView
164
+ style:(ENRMInputFormatterStyle *)style
165
+ {
166
+ [self applyBlockRanges:blockRanges
167
+ toTextView:textView
168
+ style:style
169
+ scopedToRange:NSMakeRange(0, textView.textStorage.length)];
170
+ }
171
+
172
+ - (void)applyBlockRanges:(NSArray<ENRMBlockRange *> *)blockRanges
173
+ toTextView:(ENRMPlatformTextView *)textView
174
+ style:(ENRMInputFormatterStyle *)style
175
+ scopedToRange:(NSRange)scope
176
+ {
177
+ if (_blockHandlers.count == 0) {
178
+ return;
179
+ }
180
+
181
+ NSTextStorage *textStorage = textView.textStorage;
182
+ NSUInteger textLength = textStorage.length;
183
+ if (textLength == 0) {
184
+ return;
185
+ }
186
+
187
+ NSUInteger scopeStart = MIN(scope.location, textLength);
188
+ NSUInteger scopeEnd = MIN(NSMaxRange(scope), textLength);
189
+ if (scopeEnd <= scopeStart) {
190
+ return;
191
+ }
192
+ NSRange scopeRange = NSMakeRange(scopeStart, scopeEnd - scopeStart);
193
+
194
+ [textStorage beginEditing];
195
+
196
+ // Reset pass: strip everything the previous block pass applied — paragraphs
197
+ // are found via the ENRMBlockTypeAttributeName marker — so a removed or moved
198
+ // block doesn't leave stale paragraph styling behind. Character-level
199
+ // attributes (fonts, colors) are already reset by the inline pass, which runs
200
+ // first. This runs even with zero current ranges: deleting the last block
201
+ // must still clear its styling.
202
+ NSMutableArray<NSValue *> *previouslyClaimedRanges = [NSMutableArray array];
203
+ [textStorage enumerateAttribute:ENRMBlockTypeAttributeName
204
+ inRange:scopeRange
205
+ options:0
206
+ usingBlock:^(id value, NSRange range, BOOL *stop) {
207
+ if (value != nil) {
208
+ [previouslyClaimedRanges addObject:[NSValue valueWithRange:range]];
209
+ }
210
+ }];
211
+ for (NSValue *rangeValue in previouslyClaimedRanges) {
212
+ NSRange range = rangeValue.rangeValue;
213
+ [textStorage removeAttribute:ENRMBlockTypeAttributeName range:range];
214
+ [textStorage removeAttribute:ENRMBlockLevelAttributeName range:range];
215
+ [textStorage removeAttribute:ENRMBlockOrdinalAttributeName range:range];
216
+ [textStorage removeAttribute:NSParagraphStyleAttributeName range:range];
217
+ }
218
+
219
+ for (ENRMBlockRange *blockRange in blockRanges) {
220
+ BOOL isHeadingAnchor = blockRange.range.length == 0 && ENRMHeadingLevelForBlockType(blockRange.type) > 0;
221
+
222
+ if (!isHeadingAnchor && (blockRange.range.length == 0 || NSMaxRange(blockRange.range) > textLength)) {
223
+ continue;
224
+ }
225
+ if (isHeadingAnchor && blockRange.range.location > textLength) {
226
+ continue;
227
+ }
228
+
229
+ // Scope check: normal blocks are line-scoped and either fully inside or
230
+ // outside; a zero-length heading anchor is in-scope when its point falls
231
+ // within [scopeStart, scopeEnd] inclusive.
232
+ if (isHeadingAnchor) {
233
+ if (blockRange.range.location < scopeRange.location || blockRange.range.location > NSMaxRange(scopeRange)) {
234
+ continue;
235
+ }
236
+ } else if (NSIntersectionRange(blockRange.range, scopeRange).length == 0) {
237
+ continue;
238
+ }
239
+
240
+ id<ENRMBlockHandler> handler = _blockHandlers[@(blockRange.type)];
241
+ if (!handler) {
242
+ continue;
243
+ }
244
+
245
+ NSUInteger attrIndex = blockRange.range.location;
246
+ if (attrIndex >= textLength) {
247
+ attrIndex = textLength > 0 ? textLength - 1 : 0;
248
+ }
249
+
250
+ NSParagraphStyle *existingStyle = [textStorage attribute:NSParagraphStyleAttributeName
251
+ atIndex:attrIndex
252
+ effectiveRange:NULL];
253
+ NSMutableParagraphStyle *paragraphStyle =
254
+ existingStyle ? [existingStyle mutableCopy] : [[NSMutableParagraphStyle alloc] init];
255
+ NSMutableDictionary<NSAttributedStringKey, id> *attributes = [NSMutableDictionary dictionary];
256
+
257
+ [handler applyAttributesToParagraphStyle:paragraphStyle attributes:attributes blockRange:blockRange style:style];
258
+
259
+ attributes[NSParagraphStyleAttributeName] = paragraphStyle;
260
+ attributes[ENRMBlockTypeAttributeName] = @(blockRange.type);
261
+ attributes[ENRMBlockLevelAttributeName] = @(blockRange.level);
262
+ attributes[ENRMBlockOrdinalAttributeName] = @(blockRange.ordinal);
263
+
264
+ // For a zero-length heading anchor on an empty line, stamp onto the line
265
+ // terminator so the paragraph style (heading font size) takes effect.
266
+ NSRange applyRange = blockRange.range;
267
+ if (isHeadingAnchor && applyRange.location < textLength) {
268
+ applyRange = NSMakeRange(applyRange.location, 1);
269
+ }
270
+
271
+ UIFont *blockFont = attributes[NSFontAttributeName];
272
+ if (blockFont) {
273
+ [attributes removeObjectForKey:NSFontAttributeName];
274
+ if (applyRange.length > 0) {
275
+ [self mergeFontSize:blockFont overRange:applyRange inTextStorage:textStorage];
276
+ }
277
+ }
278
+
279
+ if (applyRange.length > 0) {
280
+ [textStorage addAttributes:attributes range:applyRange];
281
+ }
219
282
  }
220
283
 
284
+ [textStorage endEditing];
285
+
221
286
  ENRMSetNeedsDisplay(textView);
222
287
  }
223
288
 
289
+ /// Applies `blockFont` over `range` while preserving the symbolic traits already
290
+ /// present on each existing font run (set by the inline formatting pass). The
291
+ /// resulting font takes its size and descriptor from `blockFont` but unions in
292
+ /// the run's traits, so inline bold/italic survives the block's size change.
293
+ - (void)mergeFontSize:(UIFont *)blockFont overRange:(NSRange)range inTextStorage:(NSTextStorage *)textStorage
294
+ {
295
+ UIFontDescriptorSymbolicTraits blockTraits = blockFont.fontDescriptor.symbolicTraits;
296
+
297
+ [textStorage enumerateAttribute:NSFontAttributeName
298
+ inRange:range
299
+ options:0
300
+ usingBlock:^(UIFont *_Nullable runFont, NSRange runRange, BOOL *_Nonnull stop) {
301
+ UIFontDescriptorSymbolicTraits runTraits = runFont ? runFont.fontDescriptor.symbolicTraits : 0;
302
+ UIFontDescriptorSymbolicTraits mergedTraits = blockTraits | runTraits;
303
+
304
+ UIFont *resolved = blockFont;
305
+ if (mergedTraits != blockTraits) {
306
+ UIFontDescriptor *descriptor =
307
+ [blockFont.fontDescriptor fontDescriptorWithSymbolicTraits:mergedTraits];
308
+ if (descriptor) {
309
+ resolved = [UIFont fontWithDescriptor:descriptor size:0];
310
+ }
311
+ }
312
+ [textStorage addAttribute:NSFontAttributeName value:resolved range:runRange];
313
+ }];
314
+ }
315
+
224
316
  @end
@@ -0,0 +1,99 @@
1
+ #pragma once
2
+
3
+ #import "ENRMUIKit.h"
4
+ #import <Foundation/Foundation.h>
5
+
6
+ NS_ASSUME_NONNULL_BEGIN
7
+
8
+ @interface ENRMInputLinkVariantStyle : NSObject
9
+
10
+ @property (nonatomic, copy) NSString *pattern;
11
+ @property (nonatomic, strong) RCTUIColor *color;
12
+ @property (nonatomic, assign) BOOL underline;
13
+ @property (nonatomic, strong, nullable) RCTUIColor *backgroundColor;
14
+ @property (nonatomic, strong, nullable) NSRegularExpression *regex;
15
+
16
+ @end
17
+
18
+ @interface ENRMInputFormatterStyle : NSObject <NSCopying>
19
+
20
+ /// Base text properties
21
+ @property (nonatomic, strong) UIFont *baseFont;
22
+ @property (nonatomic, strong) RCTUIColor *baseTextColor;
23
+
24
+ /// Bold — color override (nil = inherit baseTextColor)
25
+ @property (nonatomic, strong, nullable) RCTUIColor *boldColor;
26
+
27
+ /// Italic — color override (nil = inherit baseTextColor)
28
+ @property (nonatomic, strong, nullable) RCTUIColor *italicColor;
29
+
30
+ /// Link
31
+ @property (nonatomic, strong, nullable) RCTUIColor *linkColor;
32
+ @property (nonatomic, assign) BOOL linkUnderline;
33
+ @property (nonatomic, strong, nullable) RCTUIColor *linkBackgroundColor;
34
+ @property (nonatomic, copy) NSArray<ENRMInputLinkVariantStyle *> *linkVariants;
35
+
36
+ /// Spoiler
37
+ @property (nonatomic, strong, nullable) RCTUIColor *spoilerColor;
38
+ @property (nonatomic, strong, nullable) RCTUIColor *spoilerBackgroundColor;
39
+
40
+ /// Inline math (`$...$`) chip style, from `markdownStyle.inlineMath`.
41
+ /// Consumed by the math chip layer (ENRICHED_MARKDOWN_MATH).
42
+ @property (nonatomic, strong, nullable) RCTUIColor *inlineMathColor;
43
+ @property (nonatomic, assign) CGFloat inlineMathFontSize;
44
+ @property (nonatomic, strong, nullable) RCTUIColor *inlineMathBackgroundColor;
45
+ @property (nonatomic, strong, nullable) RCTUIColor *inlineMathBorderColor;
46
+ @property (nonatomic, assign) CGFloat inlineMathBorderWidth;
47
+ @property (nonatomic, assign) CGFloat inlineMathBorderRadius;
48
+ @property (nonatomic, assign) CGFloat inlineMathPaddingHorizontal;
49
+ @property (nonatomic, assign) CGFloat inlineMathPaddingVertical;
50
+ @property (nonatomic, strong, nullable) RCTUIColor *inlineMathSelectedBackgroundColor;
51
+ @property (nonatomic, strong, nullable) RCTUIColor *inlineMathSelectedBorderColor;
52
+ /// Raw `fontWeight` string; narrowed at the draw site (see ENRMMathFontWeight.h).
53
+ @property (nonatomic, copy, nullable) NSString *inlineMathFontWeight;
54
+
55
+ /// Block math (`$$...$$`) chip style, from `markdownStyle.math`. Field names
56
+ /// mirror the read-only renderer's `markdownStyle.math`; the author-facing
57
+ /// `padding` shorthand is expanded per axis in JS and never reaches here.
58
+ @property (nonatomic, strong, nullable) RCTUIColor *mathColor;
59
+ @property (nonatomic, assign) CGFloat mathFontSize;
60
+ @property (nonatomic, strong, nullable) RCTUIColor *mathBackgroundColor;
61
+ @property (nonatomic, strong, nullable) RCTUIColor *mathBorderColor;
62
+ @property (nonatomic, assign) CGFloat mathBorderWidth;
63
+ @property (nonatomic, assign) CGFloat mathBorderRadius;
64
+ @property (nonatomic, assign) CGFloat mathPaddingHorizontal;
65
+ @property (nonatomic, assign) CGFloat mathPaddingVertical;
66
+ @property (nonatomic, strong, nullable) RCTUIColor *mathSelectedBackgroundColor;
67
+ @property (nonatomic, strong, nullable) RCTUIColor *mathSelectedBorderColor;
68
+ @property (nonatomic, assign) CGFloat mathMarginTop;
69
+ @property (nonatomic, assign) CGFloat mathMarginBottom;
70
+ @property (nonatomic, assign) NSTextAlignment mathTextAlign;
71
+ /// Raw `fontWeight` string; narrowed at the draw site (see ENRMMathFontWeight.h).
72
+ @property (nonatomic, copy, nullable) NSString *mathFontWeight;
73
+
74
+ /// Vertical spacing (points) added above each list item via the paragraph
75
+ /// style's paragraphSpacingBefore, so bullets read as separate rows. Configured
76
+ /// from the `markdownStyle.list.itemSpacing` prop; defaults to 0 (items pack tightly).
77
+ @property (nonatomic, assign) CGFloat listItemSpacing;
78
+
79
+ /// Per-level heading config, indexed by level 1-6. A nil/0 entry means the level
80
+ /// uses a built-in default derived from the base font. Configured from the
81
+ /// `markdownStyle.h1..h6` props.
82
+ - (void)setHeadingFontSize:(CGFloat)fontSize forLevel:(NSInteger)level;
83
+ - (void)setHeadingFontWeight:(nullable NSString *)fontWeight forLevel:(NSInteger)level;
84
+ - (void)setHeadingColor:(nullable RCTUIColor *)color forLevel:(NSInteger)level;
85
+
86
+ /// Resolved foreground color for a heading level, or nil to inherit baseTextColor.
87
+ - (nullable RCTUIColor *)headingColorForLevel:(NSInteger)level;
88
+
89
+ /// Font for a heading level, built over the base font at the configured per-level
90
+ /// size and weight (from markdownStyle h1..h6). Does not carry inline traits —
91
+ /// those are merged on top in the formatter's font pass.
92
+ - (UIFont *)headingFontForLevel:(NSInteger)level;
93
+
94
+ - (UIFont *)fontForTraits:(UIFontDescriptorSymbolicTraits)traits;
95
+ - (void)invalidateFontCache;
96
+
97
+ @end
98
+
99
+ NS_ASSUME_NONNULL_END