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
@@ -14,9 +14,33 @@
14
14
  NS_ASSUME_NONNULL_BEGIN
15
15
 
16
16
  @protocol RCTEnrichedMarkdownViewProtocol <NSObject>
17
-
17
+ - (void)clearSelection;
18
18
  @end
19
19
 
20
+ RCT_EXTERN inline void RCTEnrichedMarkdownHandleCommand(
21
+ id<RCTEnrichedMarkdownViewProtocol> componentView,
22
+ NSString const *commandName,
23
+ NSArray const *args)
24
+ {
25
+ if ([commandName isEqualToString:@"clearSelection"]) {
26
+ #if RCT_DEBUG
27
+ if ([args count] != 0) {
28
+ RCTLogError(@"%@ command %@ received %d arguments, expected %d.", @"EnrichedMarkdown", commandName, (int)[args count], 0);
29
+ return;
30
+ }
31
+ #endif
32
+
33
+
34
+
35
+ [componentView clearSelection];
36
+ return;
37
+ }
38
+
39
+ #if RCT_DEBUG
40
+ RCTLogError(@"%@ received command %@, which is not a supported command.", @"EnrichedMarkdown", commandName);
41
+ #endif
42
+ }
43
+
20
44
  @protocol RCTEnrichedMarkdownTextInputViewProtocol <NSObject>
21
45
  - (void)focus;
22
46
  - (void)blur;
@@ -27,8 +51,14 @@ NS_ASSUME_NONNULL_BEGIN
27
51
  - (void)toggleUnderline;
28
52
  - (void)toggleStrikethrough;
29
53
  - (void)toggleSpoiler;
54
+ - (void)toggleHeading:(NSInteger)level;
55
+ - (void)toggleUnorderedList;
56
+ - (void)toggleOrderedList;
57
+ - (void)indentList;
58
+ - (void)outdentList;
30
59
  - (void)setLink:(NSString *)url;
31
60
  - (void)insertLink:(NSString *)text url:(NSString *)url;
61
+ - (void)insertText:(NSString *)text;
32
62
  - (void)insertMention:(NSString *)displayText url:(NSString *)url;
33
63
  - (void)startMention:(NSString *)indicator;
34
64
  - (void)removeLink;
@@ -36,6 +66,7 @@ NS_ASSUME_NONNULL_BEGIN
36
66
  - (void)updateMath:(NSInteger)start latex:(NSString *)latex displayMode:(BOOL)displayMode;
37
67
  - (void)removeMath:(NSInteger)start;
38
68
  - (void)copyToClipboard;
69
+ - (void)resolvePaste:(NSString *)text markdown:(NSString *)markdown;
39
70
  - (void)requestMarkdown:(NSInteger)requestId;
40
71
  - (void)requestCaretRect:(NSInteger)requestId;
41
72
  @end
@@ -191,6 +222,82 @@ if ([commandName isEqualToString:@"toggleSpoiler"]) {
191
222
  return;
192
223
  }
193
224
 
225
+ if ([commandName isEqualToString:@"toggleHeading"]) {
226
+ #if RCT_DEBUG
227
+ if ([args count] != 1) {
228
+ RCTLogError(@"%@ command %@ received %d arguments, expected %d.", @"EnrichedMarkdownTextInput", commandName, (int)[args count], 1);
229
+ return;
230
+ }
231
+ #endif
232
+
233
+ NSObject *arg0 = args[0];
234
+ #if RCT_DEBUG
235
+ if (!RCTValidateTypeOfViewCommandArgument(arg0, [NSNumber class], @"number", @"EnrichedMarkdownTextInput", commandName, @"1st")) {
236
+ return;
237
+ }
238
+ #endif
239
+ NSInteger level = [(NSNumber *)arg0 intValue];
240
+
241
+ [componentView toggleHeading:level];
242
+ return;
243
+ }
244
+
245
+ if ([commandName isEqualToString:@"toggleUnorderedList"]) {
246
+ #if RCT_DEBUG
247
+ if ([args count] != 0) {
248
+ RCTLogError(@"%@ command %@ received %d arguments, expected %d.", @"EnrichedMarkdownTextInput", commandName, (int)[args count], 0);
249
+ return;
250
+ }
251
+ #endif
252
+
253
+
254
+
255
+ [componentView toggleUnorderedList];
256
+ return;
257
+ }
258
+
259
+ if ([commandName isEqualToString:@"toggleOrderedList"]) {
260
+ #if RCT_DEBUG
261
+ if ([args count] != 0) {
262
+ RCTLogError(@"%@ command %@ received %d arguments, expected %d.", @"EnrichedMarkdownTextInput", commandName, (int)[args count], 0);
263
+ return;
264
+ }
265
+ #endif
266
+
267
+
268
+
269
+ [componentView toggleOrderedList];
270
+ return;
271
+ }
272
+
273
+ if ([commandName isEqualToString:@"indentList"]) {
274
+ #if RCT_DEBUG
275
+ if ([args count] != 0) {
276
+ RCTLogError(@"%@ command %@ received %d arguments, expected %d.", @"EnrichedMarkdownTextInput", commandName, (int)[args count], 0);
277
+ return;
278
+ }
279
+ #endif
280
+
281
+
282
+
283
+ [componentView indentList];
284
+ return;
285
+ }
286
+
287
+ if ([commandName isEqualToString:@"outdentList"]) {
288
+ #if RCT_DEBUG
289
+ if ([args count] != 0) {
290
+ RCTLogError(@"%@ command %@ received %d arguments, expected %d.", @"EnrichedMarkdownTextInput", commandName, (int)[args count], 0);
291
+ return;
292
+ }
293
+ #endif
294
+
295
+
296
+
297
+ [componentView outdentList];
298
+ return;
299
+ }
300
+
194
301
  if ([commandName isEqualToString:@"setLink"]) {
195
302
  #if RCT_DEBUG
196
303
  if ([args count] != 1) {
@@ -239,6 +346,26 @@ NSObject *arg1 = args[1];
239
346
  return;
240
347
  }
241
348
 
349
+ if ([commandName isEqualToString:@"insertText"]) {
350
+ #if RCT_DEBUG
351
+ if ([args count] != 1) {
352
+ RCTLogError(@"%@ command %@ received %d arguments, expected %d.", @"EnrichedMarkdownTextInput", commandName, (int)[args count], 1);
353
+ return;
354
+ }
355
+ #endif
356
+
357
+ NSObject *arg0 = args[0];
358
+ #if RCT_DEBUG
359
+ if (!RCTValidateTypeOfViewCommandArgument(arg0, [NSString class], @"string", @"EnrichedMarkdownTextInput", commandName, @"1st")) {
360
+ return;
361
+ }
362
+ #endif
363
+ NSString * text = (NSString *)arg0;
364
+
365
+ [componentView insertText:text];
366
+ return;
367
+ }
368
+
242
369
  if ([commandName isEqualToString:@"insertMention"]) {
243
370
  #if RCT_DEBUG
244
371
  if ([args count] != 2) {
@@ -399,6 +526,34 @@ if ([commandName isEqualToString:@"copyToClipboard"]) {
399
526
  return;
400
527
  }
401
528
 
529
+ if ([commandName isEqualToString:@"resolvePaste"]) {
530
+ #if RCT_DEBUG
531
+ if ([args count] != 2) {
532
+ RCTLogError(@"%@ command %@ received %d arguments, expected %d.", @"EnrichedMarkdownTextInput", commandName, (int)[args count], 2);
533
+ return;
534
+ }
535
+ #endif
536
+
537
+ NSObject *arg0 = args[0];
538
+ #if RCT_DEBUG
539
+ if (!RCTValidateTypeOfViewCommandArgument(arg0, [NSString class], @"string", @"EnrichedMarkdownTextInput", commandName, @"1st")) {
540
+ return;
541
+ }
542
+ #endif
543
+ NSString * text = (NSString *)arg0;
544
+
545
+ NSObject *arg1 = args[1];
546
+ #if RCT_DEBUG
547
+ if (!RCTValidateTypeOfViewCommandArgument(arg1, [NSString class], @"string", @"EnrichedMarkdownTextInput", commandName, @"2nd")) {
548
+ return;
549
+ }
550
+ #endif
551
+ NSString * markdown = (NSString *)arg1;
552
+
553
+ [componentView resolvePaste:text markdown:markdown];
554
+ return;
555
+ }
556
+
402
557
  if ([commandName isEqualToString:@"requestMarkdown"]) {
403
558
  #if RCT_DEBUG
404
559
  if ([args count] != 1) {
@@ -445,7 +600,31 @@ if ([commandName isEqualToString:@"requestCaretRect"]) {
445
600
  }
446
601
 
447
602
  @protocol RCTEnrichedMarkdownTextViewProtocol <NSObject>
448
-
603
+ - (void)clearSelection;
449
604
  @end
450
605
 
606
+ RCT_EXTERN inline void RCTEnrichedMarkdownTextHandleCommand(
607
+ id<RCTEnrichedMarkdownTextViewProtocol> componentView,
608
+ NSString const *commandName,
609
+ NSArray const *args)
610
+ {
611
+ if ([commandName isEqualToString:@"clearSelection"]) {
612
+ #if RCT_DEBUG
613
+ if ([args count] != 0) {
614
+ RCTLogError(@"%@ command %@ received %d arguments, expected %d.", @"EnrichedMarkdownText", commandName, (int)[args count], 0);
615
+ return;
616
+ }
617
+ #endif
618
+
619
+
620
+
621
+ [componentView clearSelection];
622
+ return;
623
+ }
624
+
625
+ #if RCT_DEBUG
626
+ RCTLogError(@"%@ received command %@, which is not a supported command.", @"EnrichedMarkdownText", commandName);
627
+ #endif
628
+ }
629
+
451
630
  NS_ASSUME_NONNULL_END
@@ -1,6 +1,7 @@
1
1
  #pragma once
2
2
 
3
3
  #import "ENRMFormattingStore.h"
4
+ #import "ENRMLinkCoordinator.h"
4
5
  #import "ENRMLinkRegexConfig.h"
5
6
  #import "ENRMTextDetector.h"
6
7
  #import <Foundation/Foundation.h>
@@ -11,7 +12,7 @@ NS_ASSUME_NONNULL_BEGIN
11
12
 
12
13
  typedef void (^ENRMAutoLinkCallback)(NSString *text, NSString *url, NSRange range);
13
14
 
14
- @interface ENRMAutoLinkDetector : NSObject <ENRMTextDetector>
15
+ @interface ENRMAutoLinkDetector : NSObject <ENRMTextDetector, ENRMAutoLinkDetecting>
15
16
 
16
17
  - (instancetype)initWithTextStorage:(NSTextStorage *)textStorage
17
18
  formattingStore:(ENRMFormattingStore *)store
@@ -34,9 +34,19 @@ static NSAttributedStringKey const ENRMAutomaticLinkAttributeName = @"ENRMAutoma
34
34
 
35
35
  - (void)processWord:(ENRMWordResult *)wordResult
36
36
  {
37
- NSString *detectedUrl = [self detectNewLinkAtRange:wordResult.range inText:wordResult.word];
37
+ NSRange matchedRange = NSMakeRange(NSNotFound, 0);
38
+ NSString *detectedUrl = [self detectNewLinkAtRange:wordResult.range
39
+ inText:wordResult.word
40
+ matchedRange:&matchedRange];
38
41
  if (detectedUrl != nil && _onLinkDetected != nil) {
39
- _onLinkDetected(wordResult.word, detectedUrl, wordResult.range);
42
+ // Emit the actual linked slice, not the whole whitespace token — surrounding
43
+ // punctuation is not part of the link.
44
+ BOOL hasSlice = matchedRange.location != NSNotFound;
45
+ NSString *matchedText = hasSlice ? [wordResult.word substringWithRange:matchedRange] : wordResult.word;
46
+ NSRange absoluteRange = hasSlice
47
+ ? NSMakeRange(wordResult.range.location + matchedRange.location, matchedRange.length)
48
+ : wordResult.range;
49
+ _onLinkDetected(matchedText, detectedUrl, absoluteRange);
40
50
  }
41
51
  }
42
52
 
@@ -92,8 +102,14 @@ static NSAttributedStringKey const ENRMAutomaticLinkAttributeName = @"ENRMAutoma
92
102
 
93
103
  #pragma mark - Link matching
94
104
 
95
- - (nullable NSString *)detectNewLinkAtRange:(NSRange)wordRange inText:(NSString *)word
105
+ - (nullable NSString *)detectNewLinkAtRange:(NSRange)wordRange
106
+ inText:(NSString *)word
107
+ matchedRange:(NSRange *)outMatchedRange
96
108
  {
109
+ if (outMatchedRange != NULL) {
110
+ *outMatchedRange = NSMakeRange(NSNotFound, 0);
111
+ }
112
+
97
113
  if (_regexConfig != nil && _regexConfig.isDisabled) {
98
114
  return nil;
99
115
  }
@@ -107,61 +123,83 @@ static NSAttributedStringKey const ENRMAutomaticLinkAttributeName = @"ENRMAutoma
107
123
  return nil;
108
124
  }
109
125
 
126
+ // Tokens carrying markdown link syntax (e.g. "[label](url)") belong to the
127
+ // parser, not the auto-linker. Auto-linking them re-wraps the destination and
128
+ // yields a corrupted URL like "https://[label](url)" on serialize.
129
+ if ([word hasPrefix:@"["] || [word rangeOfString:@"]("].location != NSNotFound) {
130
+ [self clearAutoLinkInRange:wordRange];
131
+ return nil;
132
+ }
133
+
134
+ NSRange localMatch = NSMakeRange(NSNotFound, 0);
135
+ NSString *matchedUrl = [self tryMatchWord:word matchedRange:&localMatch];
136
+
137
+ if (matchedUrl == nil || localMatch.location == NSNotFound) {
138
+ [self clearAutoLinkInRange:wordRange];
139
+ return nil;
140
+ }
141
+
142
+ NSRange matchRange = NSMakeRange(wordRange.location + localMatch.location, localMatch.length);
143
+
144
+ // A manual link overlapping the matched slice takes precedence — test the
145
+ // whole slice, not just its first character.
110
146
  ENRMFormattingStore *store = _formattingStore;
111
- if (store != nil) {
112
- ENRMFormattingRange *manualLink = [store rangeOfType:ENRMInputStyleTypeLink containingPosition:wordRange.location];
113
- if (manualLink != nil) {
114
- return nil;
115
- }
116
- }
117
-
118
- NSString *matchedUrl = [self tryMatchWord:word];
119
-
120
- if (matchedUrl != nil) {
121
- NSRange effectiveRange;
122
- id existing = [textStorage attribute:ENRMAutomaticLinkAttributeName
123
- atIndex:wordRange.location
124
- effectiveRange:&effectiveRange];
125
- BOOL alreadyApplied = [matchedUrl isEqual:existing] && NSEqualRanges(effectiveRange, wordRange);
126
-
127
- if (!alreadyApplied) {
128
- [textStorage beginEditing];
129
- [textStorage addAttribute:ENRMAutomaticLinkAttributeName value:matchedUrl range:wordRange];
130
- [self applyVisualStylingToRange:wordRange];
131
- [textStorage endEditing];
132
- }
133
- } else {
134
- id existing = [textStorage attribute:ENRMAutomaticLinkAttributeName atIndex:wordRange.location effectiveRange:nil];
135
- if (existing != nil) {
136
- [textStorage beginEditing];
137
- [textStorage removeAttribute:ENRMAutomaticLinkAttributeName range:wordRange];
138
- [textStorage endEditing];
139
- }
147
+ if (store != nil && [store isStyleActive:ENRMInputStyleTypeLink inRange:matchRange]) {
148
+ [self clearAutoLinkInRange:wordRange];
149
+ return nil;
140
150
  }
141
151
 
152
+ NSRange effectiveRange;
153
+ id existing = [textStorage attribute:ENRMAutomaticLinkAttributeName
154
+ atIndex:matchRange.location
155
+ effectiveRange:&effectiveRange];
156
+ BOOL alreadyApplied = [matchedUrl isEqual:existing] && NSEqualRanges(effectiveRange, matchRange);
157
+
158
+ if (!alreadyApplied) {
159
+ [textStorage beginEditing];
160
+ [textStorage removeAttribute:ENRMAutomaticLinkAttributeName range:wordRange];
161
+ [textStorage addAttribute:ENRMAutomaticLinkAttributeName value:matchedUrl range:matchRange];
162
+ [self applyVisualStylingToRange:matchRange];
163
+ [textStorage endEditing];
164
+ }
165
+
166
+ if (outMatchedRange != NULL) {
167
+ *outMatchedRange = localMatch;
168
+ }
142
169
  return matchedUrl;
143
170
  }
144
171
 
145
- - (nullable NSString *)tryMatchWord:(NSString *)word
172
+ - (nullable NSString *)tryMatchWord:(NSString *)word matchedRange:(NSRange *)outRange
146
173
  {
174
+ if (outRange != NULL) {
175
+ *outRange = NSMakeRange(NSNotFound, 0);
176
+ }
177
+
147
178
  if (word.length == 0) {
148
179
  return nil;
149
180
  }
150
181
 
151
- NSRange matchRange = NSMakeRange(0, word.length);
182
+ NSRange fullRange = NSMakeRange(0, word.length);
152
183
 
153
- if (_regexConfig != nil && !_regexConfig.isDefault && _regexConfig.parsedRegex != nil) {
154
- if ([_regexConfig.parsedRegex numberOfMatchesInString:word options:0 range:matchRange]) {
155
- return [ENRMAutoLinkDetector normalizeUrl:word];
156
- }
184
+ // A custom regex describes the whole-token contract, so keep whole-word
185
+ // semantics for it. The default detector extracts just the matched URL slice
186
+ // so surrounding punctuation isn't swallowed into the link.
187
+ BOOL customExact = _regexConfig != nil && !_regexConfig.isDefault && _regexConfig.parsedRegex != nil;
188
+ NSRegularExpression *regex = customExact ? _regexConfig.parsedRegex : [ENRMAutoLinkDetector defaultRegex];
189
+ if (regex == nil) {
157
190
  return nil;
158
191
  }
159
192
 
160
- if ([[ENRMAutoLinkDetector defaultRegex] numberOfMatchesInString:word options:0 range:matchRange]) {
161
- return [ENRMAutoLinkDetector normalizeUrl:word];
193
+ NSTextCheckingResult *match = [regex firstMatchInString:word options:0 range:fullRange];
194
+ if (match == nil || match.range.location == NSNotFound) {
195
+ return nil;
162
196
  }
163
197
 
164
- return nil;
198
+ NSRange matchRange = customExact ? fullRange : match.range;
199
+ if (outRange != NULL) {
200
+ *outRange = matchRange;
201
+ }
202
+ return [ENRMAutoLinkDetector normalizeUrl:[word substringWithRange:matchRange]];
165
203
  }
166
204
 
167
205
  + (NSString *)normalizeUrl:(NSString *)url
@@ -0,0 +1,71 @@
1
+ #pragma once
2
+
3
+ #import "ENRMInputBlockType.h"
4
+ #import <Foundation/Foundation.h>
5
+
6
+ @class ENRMBlockStore;
7
+ @class ENRMBlockRange;
8
+
9
+ NS_ASSUME_NONNULL_BEGIN
10
+
11
+ /// Result of a depth-change operation.
12
+ typedef NS_ENUM(NSInteger, ENRMDepthChangeResult) {
13
+ ENRMDepthChangeResultChanged,
14
+ ENRMDepthChangeResultStartedList,
15
+ ENRMDepthChangeResultExitedList,
16
+ ENRMDepthChangeResultNoOp,
17
+ };
18
+
19
+ /// Encapsulates block-editing operations: toggling block types, adjusting list
20
+ /// depth, and querying the block at a given position. The view delegates here
21
+ /// and applies UI-level consequences (formatting, anchor sync, typing
22
+ /// attributes) based on the returned result.
23
+ ///
24
+ /// All mutating methods normalize stores to line bounds before returning, so the
25
+ /// caller can re-stamp block spans immediately.
26
+ @interface ENRMBlockEditCoordinator : NSObject
27
+
28
+ - (instancetype)initWithBlockStore:(ENRMBlockStore *)blockStore;
29
+
30
+ // ── Queries ──────────────────────────────────────────────────────────
31
+
32
+ /// The block owning the paragraph at `position`, or nil.
33
+ - (nullable ENRMBlockRange *)blockAtPosition:(NSUInteger)position inText:(NSString *)text;
34
+
35
+ /// The list-item block at `position`, or nil if the paragraph is not a list item.
36
+ - (nullable ENRMBlockRange *)listBlockAtPosition:(NSUInteger)position inText:(NSString *)text;
37
+
38
+ /// Heading level (1-6) at `position`, or 0 for non-heading paragraphs.
39
+ - (NSInteger)headingLevelAtPosition:(NSUInteger)position inText:(NSString *)text;
40
+
41
+ /// Whether the paragraph at `position` is a list item of `type`, and its depth.
42
+ - (BOOL)listStateOfType:(ENRMInputBlockType)type
43
+ atPosition:(NSUInteger)position
44
+ inText:(NSString *)text
45
+ depth:(nullable NSInteger *)outDepth;
46
+
47
+ // ── Mutations ────────────────────────────────────────────────────────
48
+
49
+ /// Toggles `type` at `level` on the paragraphs the selection touches.
50
+ /// Returns YES when the block was already active (i.e. it was turned off).
51
+ - (BOOL)toggleBlockType:(ENRMInputBlockType)type
52
+ level:(NSInteger)level
53
+ selectionRange:(NSRange)selection
54
+ inText:(NSString *)text;
55
+
56
+ /// Toggles a list of `type` on the selection.
57
+ /// Returns YES when the list was turned off.
58
+ - (BOOL)toggleListType:(ENRMInputBlockType)type
59
+ cursorPosition:(NSUInteger)cursorPos
60
+ selectionRange:(NSRange)selection
61
+ inText:(NSString *)text;
62
+
63
+ /// Adjusts list depth by `delta` on the selected lines.
64
+ - (ENRMDepthChangeResult)changeDepthBy:(NSInteger)delta
65
+ cursorPosition:(NSUInteger)cursorPos
66
+ selectionRange:(NSRange)selection
67
+ inText:(NSString *)text;
68
+
69
+ @end
70
+
71
+ NS_ASSUME_NONNULL_END
@@ -0,0 +1,195 @@
1
+ #import "ENRMBlockEditCoordinator.h"
2
+ #import "ENRMBlockRange.h"
3
+ #import "ENRMBlockStore.h"
4
+
5
+ @implementation ENRMBlockEditCoordinator {
6
+ ENRMBlockStore *_blockStore;
7
+ }
8
+
9
+ - (instancetype)initWithBlockStore:(ENRMBlockStore *)blockStore
10
+ {
11
+ self = [super init];
12
+ if (self) {
13
+ _blockStore = blockStore;
14
+ }
15
+ return self;
16
+ }
17
+
18
+ // ── Queries ──────────────────────────────────────────────────────────
19
+
20
+ - (nullable ENRMBlockRange *)blockAtPosition:(NSUInteger)position inText:(NSString *)text
21
+ {
22
+ if (position > text.length) {
23
+ return nil;
24
+ }
25
+ NSRange paragraph = [text paragraphRangeForRange:NSMakeRange(position, 0)];
26
+ return [_blockStore blockStartingAtLocation:paragraph.location];
27
+ }
28
+
29
+ - (nullable ENRMBlockRange *)listBlockAtPosition:(NSUInteger)position inText:(NSString *)text
30
+ {
31
+ ENRMBlockRange *block = [self blockAtPosition:position inText:text];
32
+ return (block != nil && ENRMBlockTypeIsListItem(block.type)) ? block : nil;
33
+ }
34
+
35
+ - (NSInteger)headingLevelAtPosition:(NSUInteger)position inText:(NSString *)text
36
+ {
37
+ ENRMBlockRange *block = [self blockAtPosition:position inText:text];
38
+ return block != nil ? ENRMHeadingLevelForBlockType(block.type) : 0;
39
+ }
40
+
41
+ - (BOOL)listStateOfType:(ENRMInputBlockType)type
42
+ atPosition:(NSUInteger)position
43
+ inText:(NSString *)text
44
+ depth:(nullable NSInteger *)outDepth
45
+ {
46
+ ENRMBlockRange *block = [self listBlockAtPosition:position inText:text];
47
+ BOOL match = block != nil && block.type == type;
48
+ if (outDepth) {
49
+ *outDepth = match ? block.level : 0;
50
+ }
51
+ return match;
52
+ }
53
+
54
+ // ── Mutations ────────────────────────────────────────────────────────
55
+
56
+ - (BOOL)toggleBlockType:(ENRMInputBlockType)type
57
+ level:(NSInteger)level
58
+ selectionRange:(NSRange)selection
59
+ inText:(NSString *)text
60
+ {
61
+ NSRange paragraphRange = [text paragraphRangeForRange:selection];
62
+
63
+ ENRMBlockRange *current = [_blockStore blockStartingAtLocation:paragraphRange.location];
64
+ BOOL alreadyActive = current != nil && current.type == type;
65
+
66
+ if (alreadyActive) {
67
+ [_blockStore removeBlockInParagraphRange:paragraphRange inText:text];
68
+ } else if (paragraphRange.length == 0) {
69
+ NSInteger resolvedLevel = level;
70
+ if (ENRMBlockTypeIsListItem(type) && current != nil && ENRMBlockTypeIsListItem(current.type)) {
71
+ resolvedLevel = current.level;
72
+ }
73
+ [_blockStore setBlockType:type level:resolvedLevel forParagraphRange:paragraphRange inText:text];
74
+ } else {
75
+ [text
76
+ enumerateSubstringsInRange:paragraphRange
77
+ options:NSStringEnumerationByParagraphs | NSStringEnumerationSubstringNotRequired
78
+ usingBlock:^(NSString *substring, NSRange substringRange, NSRange enclosingRange, BOOL *stop) {
79
+ NSInteger paragraphLevel = level;
80
+ if (ENRMBlockTypeIsListItem(type)) {
81
+ ENRMBlockRange *existing = [self listBlockAtPosition:substringRange.location inText:text];
82
+ if (existing != nil) {
83
+ paragraphLevel = existing.level;
84
+ }
85
+ }
86
+ [self->_blockStore setBlockType:type
87
+ level:paragraphLevel
88
+ forParagraphRange:substringRange
89
+ inText:text];
90
+ }];
91
+ }
92
+
93
+ [_blockStore normalizeToLineBoundsInText:text];
94
+ return alreadyActive;
95
+ }
96
+
97
+ - (BOOL)toggleListType:(ENRMInputBlockType)type
98
+ cursorPosition:(NSUInteger)cursorPos
99
+ selectionRange:(NSRange)selection
100
+ inText:(NSString *)text
101
+ {
102
+ ENRMBlockRange *cursorBlock = [self listBlockAtPosition:cursorPos inText:text];
103
+ BOOL turningOff = cursorBlock != nil && cursorBlock.type == type;
104
+ NSRange paragraphRange = [text paragraphRangeForRange:selection];
105
+
106
+ if (turningOff) {
107
+ if (paragraphRange.length == 0) {
108
+ [_blockStore removeBlockInParagraphRange:paragraphRange inText:text];
109
+ } else {
110
+ [text enumerateSubstringsInRange:paragraphRange
111
+ options:NSStringEnumerationByParagraphs | NSStringEnumerationSubstringNotRequired
112
+ usingBlock:^(NSString *substring, NSRange substringRange, NSRange enclosingRange,
113
+ BOOL *stop) {
114
+ [self->_blockStore removeBlockInParagraphRange:substringRange inText:text];
115
+ }];
116
+ }
117
+ } else {
118
+ if (paragraphRange.length == 0) {
119
+ NSInteger existingLevel = 0;
120
+ ENRMBlockRange *existing = [self listBlockAtPosition:paragraphRange.location inText:text];
121
+ if (existing != nil) {
122
+ existingLevel = existing.level;
123
+ }
124
+ [_blockStore setBlockType:type level:existingLevel forParagraphRange:paragraphRange inText:text];
125
+ } else {
126
+ [text enumerateSubstringsInRange:paragraphRange
127
+ options:NSStringEnumerationByParagraphs | NSStringEnumerationSubstringNotRequired
128
+ usingBlock:^(NSString *substring, NSRange substringRange, NSRange enclosingRange,
129
+ BOOL *stop) {
130
+ NSInteger existingLevel = 0;
131
+ ENRMBlockRange *existing = [self listBlockAtPosition:substringRange.location inText:text];
132
+ if (existing != nil) {
133
+ existingLevel = existing.level;
134
+ }
135
+ [self->_blockStore setBlockType:type
136
+ level:existingLevel
137
+ forParagraphRange:substringRange
138
+ inText:text];
139
+ }];
140
+ }
141
+ }
142
+
143
+ [_blockStore normalizeToLineBoundsInText:text];
144
+ return turningOff;
145
+ }
146
+
147
+ - (ENRMDepthChangeResult)changeDepthBy:(NSInteger)delta
148
+ cursorPosition:(NSUInteger)cursorPos
149
+ selectionRange:(NSRange)selection
150
+ inText:(NSString *)text
151
+ {
152
+ ENRMBlockRange *cursorBlock = [self listBlockAtPosition:cursorPos inText:text];
153
+ if (cursorBlock == nil) {
154
+ if (delta > 0 && [self headingLevelAtPosition:cursorPos inText:text] == 0) {
155
+ [self toggleListType:ENRMInputBlockTypeUnorderedListItem
156
+ cursorPosition:cursorPos
157
+ selectionRange:selection
158
+ inText:text];
159
+ return ENRMDepthChangeResultStartedList;
160
+ }
161
+ return ENRMDepthChangeResultNoOp;
162
+ }
163
+
164
+ if (delta < 0 && cursorBlock.level == 0) {
165
+ [self toggleListType:cursorBlock.type cursorPosition:cursorPos selectionRange:selection inText:text];
166
+ return ENRMDepthChangeResultExitedList;
167
+ }
168
+
169
+ NSRange paragraphRange = [text paragraphRangeForRange:selection];
170
+
171
+ if (paragraphRange.length == 0) {
172
+ NSInteger newDepth = MIN(MAX(cursorBlock.level + delta, (NSInteger)0), kENRMMaxListDepth);
173
+ [_blockStore setBlockType:cursorBlock.type level:newDepth forParagraphRange:paragraphRange inText:text];
174
+ } else {
175
+ [text
176
+ enumerateSubstringsInRange:paragraphRange
177
+ options:NSStringEnumerationByParagraphs | NSStringEnumerationSubstringNotRequired
178
+ usingBlock:^(NSString *substring, NSRange substringRange, NSRange enclosingRange, BOOL *stop) {
179
+ ENRMBlockRange *block = [self listBlockAtPosition:substringRange.location inText:text];
180
+ if (block == nil) {
181
+ return;
182
+ }
183
+ NSInteger newDepth = MIN(MAX(block.level + delta, (NSInteger)0), kENRMMaxListDepth);
184
+ [self->_blockStore setBlockType:block.type
185
+ level:newDepth
186
+ forParagraphRange:substringRange
187
+ inText:text];
188
+ }];
189
+ }
190
+
191
+ [_blockStore normalizeToLineBoundsInText:text];
192
+ return ENRMDepthChangeResultChanged;
193
+ }
194
+
195
+ @end