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
@@ -2,5 +2,5 @@
2
2
  #import "MarkdownASTNode.h"
3
3
  #import "RenderContext.h"
4
4
 
5
- @interface BlockquoteRenderer : BaseRenderer <NodeRenderer>
5
+ @interface BlockquoteRenderer : BaseRenderer
6
6
  @end
@@ -1,8 +1,11 @@
1
1
  #import "BlockquoteRenderer.h"
2
2
  #import "BlockquoteBorder.h"
3
3
  #import "FontUtils.h"
4
+ #import "LastElementUtils.h"
5
+ #import "ListItemRenderer.h"
4
6
  #import "MarkdownASTNode.h"
5
7
  #import "ParagraphStyleUtils.h"
8
+ #import "RenderContext.h"
6
9
  #import "RendererFactory.h"
7
10
  #import "StyleConfig.h"
8
11
 
@@ -11,8 +14,19 @@ static NSString *const kNestedInfoRangeKey = @"range";
11
14
 
12
15
  @implementation BlockquoteRenderer
13
16
 
14
- - (void)renderNode:(MarkdownASTNode *)node into:(NSMutableAttributedString *)output context:(RenderContext *)context
17
+ - (id)takeContextSnapshot:(RenderContext *)context
15
18
  {
19
+ return [context snapshotScope];
20
+ }
21
+
22
+ - (void)renderNodeContent:(MarkdownASTNode *)node
23
+ into:(NSMutableAttributedString *)output
24
+ context:(RenderContext *)context
25
+ {
26
+ if (output.length > 0 && ![output.string hasSuffix:@"\n"]) {
27
+ [output appendAttributedString:kNewlineAttributedString];
28
+ }
29
+
16
30
  NSInteger currentDepth = context.blockquoteDepth;
17
31
  context.blockquoteDepth = currentDepth + 1;
18
32
 
@@ -22,19 +36,14 @@ static NSString *const kNestedInfoRangeKey = @"range";
22
36
  headingLevel:0];
23
37
 
24
38
  NSUInteger start = output.length;
25
- @try {
26
- [_rendererFactory renderChildrenOfNode:node into:output context:context];
27
- } @finally {
28
- [context clearBlockStyle];
29
- context.blockquoteDepth = currentDepth;
30
- }
39
+ [_rendererFactory renderChildrenOfNode:node into:output context:context];
31
40
 
32
41
  NSUInteger end = output.length;
33
42
  if (end <= start) {
34
43
  return;
35
44
  }
36
45
 
37
- [self applyStylingAndSpacing:output start:start end:end currentDepth:currentDepth];
46
+ [self applyStylingAndSpacing:output start:start end:end currentDepth:currentDepth context:context];
38
47
  }
39
48
 
40
49
  #pragma mark - Styling and Spacing
@@ -43,19 +52,42 @@ static NSString *const kNestedInfoRangeKey = @"range";
43
52
  start:(NSUInteger)start
44
53
  end:(NSUInteger)end
45
54
  currentDepth:(NSInteger)currentDepth
55
+ context:(RenderContext *)context
46
56
  {
47
57
  NSUInteger contentStart = start;
48
58
  if (currentDepth == 0) {
49
59
  contentStart += applyBlockSpacingBefore(output, start, [_config blockquoteMarginTop]);
50
60
  }
51
61
 
52
- NSRange blockquoteRange = NSMakeRange(contentStart, end - start);
62
+ // nested quotes pad their own box (matching web CSS padding)
63
+ CGFloat padding = [_config blockquotePadding];
64
+ NSUInteger topPadLength = 0;
65
+ NSUInteger bottomPadLength = 0;
66
+ if (padding > 0) {
67
+ NSMutableParagraphStyle *topSpacerStyle = [context spacerStyleWithHeight:padding spacing:0];
68
+ NSAttributedString *topSpacer = [[NSAttributedString alloc]
69
+ initWithString:@"\n"
70
+ attributes:@{NSParagraphStyleAttributeName : topSpacerStyle, BlockquoteSpacerAttributeName : @YES}];
71
+ [output insertAttributedString:topSpacer atIndex:contentStart];
72
+ topPadLength = 1;
73
+
74
+ NSUInteger bottomSpacerLocation = output.length;
75
+ [output appendAttributedString:kNewlineAttributedString];
76
+ NSMutableParagraphStyle *bottomSpacerStyle = [context spacerStyleWithHeight:padding spacing:0];
77
+ [output addAttributes:@{NSParagraphStyleAttributeName : bottomSpacerStyle, BlockquoteSpacerAttributeName : @YES}
78
+ range:NSMakeRange(bottomSpacerLocation, 1)];
79
+ bottomPadLength = 1;
80
+ }
81
+
82
+ NSRange blockquoteRange = NSMakeRange(contentStart, (end - start) + topPadLength + bottomPadLength);
83
+ NSRange innerRange = NSMakeRange(contentStart + topPadLength, end - start);
53
84
  CGFloat levelSpacing = [_config blockquoteBorderWidth] + [_config blockquoteGapWidth];
54
- NSArray<NSDictionary *> *nestedInfo = [self collectNestedBlockquotes:output range:blockquoteRange depth:currentDepth];
85
+ NSArray<NSDictionary *> *nestedInfo = [self collectNestedBlockquotes:output range:innerRange depth:currentDepth];
55
86
 
56
87
  // Apply base styling (indentation, depth, background, line height)
57
88
  [self applyBaseBlockquoteStyle:output
58
- range:blockquoteRange
89
+ boxRange:blockquoteRange
90
+ innerRange:innerRange
59
91
  depth:currentDepth
60
92
  levelSpacing:levelSpacing
61
93
  backgroundColor:[_config blockquoteBackgroundColor]
@@ -94,26 +126,66 @@ static NSString *const kNestedInfoRangeKey = @"range";
94
126
  }
95
127
 
96
128
  - (void)applyBaseBlockquoteStyle:(NSMutableAttributedString *)output
97
- range:(NSRange)blockquoteRange
129
+ boxRange:(NSRange)boxRange
130
+ innerRange:(NSRange)innerRange
98
131
  depth:(NSInteger)currentDepth
99
132
  levelSpacing:(CGFloat)levelSpacing
100
133
  backgroundColor:(RCTUIColor *)backgroundColor
101
134
  lineHeight:(CGFloat)lineHeight
102
135
  {
103
- NSMutableParagraphStyle *paragraphStyle = getOrCreateParagraphStyle(output, blockquoteRange.location);
104
- CGFloat totalIndent = [self calculateIndentForDepth:currentDepth levelSpacing:levelSpacing];
105
- paragraphStyle.firstLineHeadIndent = totalIndent;
106
- paragraphStyle.headIndent = totalIndent;
107
-
108
- NSMutableDictionary *newAttributes =
109
- [NSMutableDictionary dictionaryWithObjectsAndKeys:paragraphStyle, NSParagraphStyleAttributeName, @(currentDepth),
110
- BlockquoteDepthAttributeName, nil];
136
+ CGFloat totalIndent = blockquoteIndentForDepth(currentDepth + 1, levelSpacing);
137
+ CGFloat padding = [_config blockquotePadding];
138
+
139
+ // Depth and background cover the whole box (incl. padding spacers) so the
140
+ // border and background render behind list content and the padding rows.
141
+ NSMutableDictionary *depthAttributes =
142
+ [NSMutableDictionary dictionaryWithObjectsAndKeys:@(currentDepth), BlockquoteDepthAttributeName, nil];
111
143
  if (backgroundColor) {
112
- newAttributes[BlockquoteBackgroundColorAttributeName] = backgroundColor;
144
+ depthAttributes[BlockquoteBackgroundColorAttributeName] = backgroundColor;
113
145
  }
114
- [output addAttributes:newAttributes range:blockquoteRange];
146
+ [output addAttributes:depthAttributes range:boxRange];
115
147
 
116
- applyLineHeight(output, blockquoteRange, lineHeight);
148
+ // List items bake the blockquote indent into their own paragraph style; only non-list content is stamped here.
149
+ [self enumerateNonListRangesIn:output
150
+ range:innerRange
151
+ usingBlock:^(NSRange nonListRange) {
152
+ NSMutableParagraphStyle *paragraphStyle =
153
+ getOrCreateParagraphStyle(output, nonListRange.location);
154
+ paragraphStyle.firstLineHeadIndent = totalIndent;
155
+ paragraphStyle.headIndent = totalIndent;
156
+ if (padding > 0) {
157
+ paragraphStyle.tailIndent = -padding;
158
+ }
159
+ [output addAttribute:NSParagraphStyleAttributeName value:paragraphStyle range:nonListRange];
160
+ applyLineHeight(output, nonListRange, lineHeight);
161
+ }];
162
+
163
+ if (padding > 0) {
164
+ [self applyTailIndent:-padding toListRangesIn:output range:innerRange];
165
+ }
166
+ }
167
+
168
+ - (void)applyTailIndent:(CGFloat)tailIndent toListRangesIn:(NSMutableAttributedString *)output range:(NSRange)range
169
+ {
170
+ [output enumerateAttribute:ListDepthAttribute
171
+ inRange:range
172
+ options:0
173
+ usingBlock:^(id value, NSRange listRange, BOOL *stop) {
174
+ if (!value) {
175
+ return;
176
+ }
177
+ [output enumerateAttribute:NSParagraphStyleAttributeName
178
+ inRange:listRange
179
+ options:0
180
+ usingBlock:^(NSParagraphStyle *style, NSRange styleRange, BOOL *innerStop) {
181
+ NSMutableParagraphStyle *mutableStyle =
182
+ style ? [style mutableCopy] : [[NSMutableParagraphStyle alloc] init];
183
+ mutableStyle.tailIndent = tailIndent;
184
+ [output addAttribute:NSParagraphStyleAttributeName
185
+ value:mutableStyle
186
+ range:styleRange];
187
+ }];
188
+ }];
117
189
  }
118
190
 
119
191
  - (void)reapplyNestedStyles:(NSMutableAttributedString *)output
@@ -122,27 +194,64 @@ static NSString *const kNestedInfoRangeKey = @"range";
122
194
  {
123
195
  // Re-apply indentation to nested blockquotes since applyBaseBlockquoteStyle
124
196
  // overwrote them with the parent's indentation
197
+ CGFloat padding = [_config blockquotePadding];
125
198
  for (NSDictionary *info in nestedInfo) {
126
199
  NSRange nestedRange = [info[kNestedInfoRangeKey] rangeValue];
127
200
  NSInteger nestedDepth = [info[kNestedInfoDepthKey] integerValue];
128
- NSMutableParagraphStyle *style = getOrCreateParagraphStyle(output, nestedRange.location);
201
+ CGFloat indent = blockquoteIndentForDepth(nestedDepth + 1, levelSpacing);
129
202
 
130
- CGFloat indent = [self calculateIndentForDepth:nestedDepth levelSpacing:levelSpacing];
131
- style.firstLineHeadIndent = indent;
132
- style.headIndent = indent;
133
- style.tailIndent = 0;
203
+ [output addAttribute:BlockquoteDepthAttributeName value:info[kNestedInfoDepthKey] range:nestedRange];
134
204
 
135
- [output
136
- addAttributes:@{NSParagraphStyleAttributeName : style, BlockquoteDepthAttributeName : info[kNestedInfoDepthKey]}
137
- range:nestedRange];
205
+ [self enumerateNonListRangesIn:output
206
+ range:nestedRange
207
+ usingBlock:^(NSRange nonListRange) {
208
+ NSMutableParagraphStyle *style = getOrCreateParagraphStyle(output, nonListRange.location);
209
+ style.firstLineHeadIndent = indent;
210
+ style.headIndent = indent;
211
+ style.tailIndent = padding > 0 ? -padding : 0;
212
+ [output addAttribute:NSParagraphStyleAttributeName value:style range:nonListRange];
213
+ }];
138
214
  }
139
215
  }
140
216
 
141
- #pragma mark - Helper Methods
142
-
143
- - (CGFloat)calculateIndentForDepth:(NSInteger)depth levelSpacing:(CGFloat)levelSpacing
217
+ - (void)enumerateNonListRangesIn:(NSMutableAttributedString *)output
218
+ range:(NSRange)range
219
+ usingBlock:(void (^)(NSRange nonListRange))block
144
220
  {
145
- return (depth + 1) * levelSpacing;
221
+ // List items — and code blocks nested inside them (which carry a list-derived
222
+ // indent instead of ListDepthAttribute) — already bake the correct indent in.
223
+ NSMutableArray<NSValue *> *listRanges = [NSMutableArray array];
224
+ void (^collectRanges)(NSString *) = ^(NSString *attribute) {
225
+ [output enumerateAttribute:attribute
226
+ inRange:range
227
+ options:0
228
+ usingBlock:^(id value, NSRange subRange, BOOL *stop) {
229
+ if (value) {
230
+ [listRanges addObject:[NSValue valueWithRange:subRange]];
231
+ }
232
+ }];
233
+ };
234
+ collectRanges(ListDepthAttribute);
235
+ collectRanges(CodeBlockIndentAttributeName);
236
+ collectRanges(BlockquoteSpacerAttributeName);
237
+ [listRanges sortUsingComparator:^NSComparisonResult(NSValue *a, NSValue *b) {
238
+ NSUInteger la = [a rangeValue].location;
239
+ NSUInteger lb = [b rangeValue].location;
240
+ return la < lb ? NSOrderedAscending : (la > lb ? NSOrderedDescending : NSOrderedSame);
241
+ }];
242
+
243
+ NSUInteger pos = range.location;
244
+ const NSUInteger end = NSMaxRange(range);
245
+ for (NSValue *val in listRanges) {
246
+ NSRange listRange = [val rangeValue];
247
+ if (pos < listRange.location) {
248
+ block(NSMakeRange(pos, listRange.location - pos));
249
+ }
250
+ pos = MAX(pos, NSMaxRange(listRange));
251
+ }
252
+ if (pos < end) {
253
+ block(NSMakeRange(pos, end - pos));
254
+ }
146
255
  }
147
256
 
148
257
  @end
@@ -3,7 +3,7 @@
3
3
 
4
4
  NS_ASSUME_NONNULL_BEGIN
5
5
 
6
- @interface CodeBlockRenderer : BaseRenderer <NodeRenderer>
6
+ @interface CodeBlockRenderer : BaseRenderer
7
7
  @end
8
8
 
9
9
  NS_ASSUME_NONNULL_END
@@ -1,5 +1,7 @@
1
1
  #import "CodeBlockRenderer.h"
2
2
  #import "CodeBlockBackground.h"
3
+ #import "ENRMCodeBlockContent.h"
4
+ #import "ENRMCodeBlockHighlighter.h"
3
5
  #import "LastElementUtils.h"
4
6
  #import "MarkdownASTNode.h"
5
7
  #import "ParagraphStyleUtils.h"
@@ -9,12 +11,25 @@
9
11
 
10
12
  @implementation CodeBlockRenderer
11
13
 
12
- - (void)renderNode:(MarkdownASTNode *)node into:(NSMutableAttributedString *)output context:(RenderContext *)context
14
+ - (id)takeContextSnapshot:(RenderContext *)context
13
15
  {
16
+ return [context snapshotScope];
17
+ }
18
+
19
+ - (void)renderNodeContent:(MarkdownASTNode *)node
20
+ into:(NSMutableAttributedString *)output
21
+ context:(RenderContext *)context
22
+ {
23
+ // In tight lists md4c emits raw Text siblings without paragraph wrappers,
24
+ // so the preceding content may not terminate with a newline.
25
+ if (output.length > 0 && ![output.string hasSuffix:@"\n"]) {
26
+ [output appendAttributedString:kNewlineAttributedString];
27
+ }
28
+
14
29
  [context setBlockStyle:BlockTypeCodeBlock font:[_config codeBlockFont] color:[_config codeBlockColor] headingLevel:0];
15
30
 
31
+ CGFloat listIndent = context.accumulatedIndent;
16
32
  CGFloat padding = [_config codeBlockPadding];
17
- CGFloat lineHeight = [_config codeBlockLineHeight];
18
33
  CGFloat marginTop = [_config codeBlockMarginTop];
19
34
  CGFloat marginBottom = [_config codeBlockMarginBottom];
20
35
 
@@ -31,11 +46,7 @@
31
46
  }
32
47
 
33
48
  NSUInteger contentStart = output.length;
34
- @try {
35
- [_rendererFactory renderChildrenOfNode:node into:output context:context];
36
- } @finally {
37
- [context clearBlockStyle];
38
- }
49
+ [_rendererFactory renderChildrenOfNode:node into:output context:context];
39
50
 
40
51
  NSUInteger contentEnd = output.length;
41
52
  if (contentEnd <= contentStart)
@@ -43,25 +54,15 @@
43
54
 
44
55
  NSRange contentRange = NSMakeRange(contentStart, contentEnd - contentStart);
45
56
 
46
- UIFont *codeFont = [_config codeBlockFont];
47
- RCTUIColor *codeColor = [_config codeBlockColor];
48
- if (codeColor) {
49
- [output addAttributes:@{NSFontAttributeName : codeFont, NSForegroundColorAttributeName : codeColor}
50
- range:contentRange];
51
- } else {
52
- [output addAttribute:NSFontAttributeName value:codeFont range:contentRange];
53
- }
57
+ ENRMApplyCodeBlockTextAttributes(output, contentRange, _config);
54
58
 
55
- if (lineHeight > 0) {
56
- applyLineHeight(output, contentRange, lineHeight);
57
- }
59
+ ENRMApplyHighlightTokens(output, contentRange, ENRMCodeBlockExtractCode(node), ENRMCodeBlockLanguage(node), _config);
58
60
 
59
- // Code is always LTR regardless of app writing direction
61
+ // Horizontal padding is paragraph indentation in this flavor; the shared
62
+ // helper already forced the LTR left-aligned base style.
60
63
  NSMutableParagraphStyle *baseStyle = [getOrCreateParagraphStyle(output, contentStart) mutableCopy];
61
- baseStyle.baseWritingDirection = NSWritingDirectionLeftToRight;
62
- baseStyle.alignment = NSTextAlignmentLeft;
63
- baseStyle.firstLineHeadIndent = padding;
64
- baseStyle.headIndent = padding;
64
+ baseStyle.firstLineHeadIndent = padding + listIndent;
65
+ baseStyle.headIndent = padding + listIndent;
65
66
  baseStyle.tailIndent = -padding;
66
67
  [output addAttribute:NSParagraphStyleAttributeName value:baseStyle range:contentRange];
67
68
 
@@ -80,6 +81,9 @@
80
81
  // Define the range for background rendering (includes padding, excludes margins)
81
82
  NSRange backgroundRange = NSMakeRange(blockStart, output.length - blockStart);
82
83
  [output addAttribute:CodeBlockAttributeName value:@YES range:backgroundRange];
84
+ if (listIndent > 0) {
85
+ [output addAttribute:CodeBlockIndentAttributeName value:@(listIndent) range:backgroundRange];
86
+ }
83
87
 
84
88
  // External Margin: Applied outside the background range
85
89
  if (marginBottom > 0) {
@@ -3,7 +3,7 @@
3
3
 
4
4
  NS_ASSUME_NONNULL_BEGIN
5
5
 
6
- @interface CodeRenderer : BaseRenderer <NodeRenderer>
6
+ @interface CodeRenderer : BaseRenderer
7
7
  @end
8
8
 
9
9
  NS_ASSUME_NONNULL_END
@@ -10,7 +10,9 @@
10
10
 
11
11
  @implementation CodeRenderer
12
12
 
13
- - (void)renderNode:(MarkdownASTNode *)node into:(NSMutableAttributedString *)output context:(RenderContext *)context
13
+ - (void)renderNodeContent:(MarkdownASTNode *)node
14
+ into:(NSMutableAttributedString *)output
15
+ context:(RenderContext *)context
14
16
  {
15
17
 
16
18
  BlockStyle *blockStyle = [context getBlockStyle];
@@ -3,7 +3,7 @@
3
3
 
4
4
  NS_ASSUME_NONNULL_BEGIN
5
5
 
6
- @interface ENRMImageRenderer : BaseRenderer <NodeRenderer>
6
+ @interface ENRMImageRenderer : BaseRenderer
7
7
  @end
8
8
 
9
9
  NS_ASSUME_NONNULL_END
@@ -10,7 +10,9 @@ static const unichar kZeroWidthSpace = 0x200B;
10
10
 
11
11
  @implementation ENRMImageRenderer
12
12
 
13
- - (void)renderNode:(MarkdownASTNode *)node into:(NSMutableAttributedString *)output context:(RenderContext *)context
13
+ - (void)renderNodeContent:(MarkdownASTNode *)node
14
+ into:(NSMutableAttributedString *)output
15
+ context:(RenderContext *)context
14
16
  {
15
17
  NSString *imageURL = node.attributes[@"url"];
16
18
  if (!imageURL || imageURL.length == 0) {
@@ -45,6 +47,8 @@ static const unichar kZeroWidthSpace = 0x200B;
45
47
  {
46
48
  if (node.content.length > 0) {
47
49
  [buffer appendString:node.content];
50
+ } else if (node.type == MarkdownNodeTypeSoftBreak || node.type == MarkdownNodeTypeLineBreak) {
51
+ [buffer appendString:@" "];
48
52
  }
49
53
 
50
54
  for (MarkdownASTNode *child in node.children) {
@@ -3,7 +3,7 @@
3
3
 
4
4
  NS_ASSUME_NONNULL_BEGIN
5
5
 
6
- @interface ENRMMathInlineRenderer : BaseRenderer <NodeRenderer>
6
+ @interface ENRMMathInlineRenderer : BaseRenderer
7
7
  @end
8
8
 
9
9
  NS_ASSUME_NONNULL_END
@@ -12,7 +12,9 @@
12
12
 
13
13
  @implementation ENRMMathInlineRenderer
14
14
 
15
- - (void)renderNode:(MarkdownASTNode *)node into:(NSMutableAttributedString *)output context:(RenderContext *)context
15
+ - (void)renderNodeContent:(MarkdownASTNode *)node
16
+ into:(NSMutableAttributedString *)output
17
+ context:(RenderContext *)context
16
18
  {
17
19
  NSString *latex = [self extractLatexFromNode:node];
18
20
  if (latex.length == 0) {
@@ -53,6 +55,8 @@
53
55
  for (MarkdownASTNode *child in node.children) {
54
56
  if (child.content.length > 0) {
55
57
  [buffer appendString:child.content];
58
+ } else if (child.type == MarkdownNodeTypeSoftBreak || child.type == MarkdownNodeTypeLineBreak) {
59
+ [buffer appendString:@" "];
56
60
  }
57
61
  }
58
62
  return buffer;
@@ -1,5 +1,5 @@
1
1
  #pragma once
2
2
  #import "BaseRenderer.h"
3
3
 
4
- @interface ENRMSpoilerRenderer : BaseRenderer <NodeRenderer>
4
+ @interface ENRMSpoilerRenderer : BaseRenderer
5
5
  @end
@@ -6,7 +6,9 @@
6
6
 
7
7
  @implementation ENRMSpoilerRenderer
8
8
 
9
- - (void)renderNode:(MarkdownASTNode *)node into:(NSMutableAttributedString *)output context:(RenderContext *)context
9
+ - (void)renderNodeContent:(MarkdownASTNode *)node
10
+ into:(NSMutableAttributedString *)output
11
+ context:(RenderContext *)context
10
12
  {
11
13
  NSUInteger start = output.length;
12
14
  [_rendererFactory renderChildrenOfNode:node into:output context:context];
@@ -1,5 +1,5 @@
1
1
  #pragma once
2
2
  #import "BaseRenderer.h"
3
3
 
4
- @interface EmphasisRenderer : BaseRenderer <NodeRenderer>
4
+ @interface EmphasisRenderer : BaseRenderer
5
5
  @end
@@ -10,7 +10,9 @@
10
10
 
11
11
  #pragma mark - Rendering
12
12
 
13
- - (void)renderNode:(MarkdownASTNode *)node into:(NSMutableAttributedString *)output context:(RenderContext *)context
13
+ - (void)renderNodeContent:(MarkdownASTNode *)node
14
+ into:(NSMutableAttributedString *)output
15
+ context:(RenderContext *)context
14
16
  {
15
17
  NSUInteger start = output.length;
16
18
  [_rendererFactory renderChildrenOfNode:node into:output context:context];
@@ -2,5 +2,5 @@
2
2
  #import "MarkdownASTNode.h"
3
3
  #import "RenderContext.h"
4
4
 
5
- @interface HeadingRenderer : BaseRenderer <NodeRenderer>
5
+ @interface HeadingRenderer : BaseRenderer
6
6
  @end
@@ -21,8 +21,19 @@ static NSString *const kHeadingTypes[] = {nil, @"heading-1", @"heading-
21
21
 
22
22
  @implementation HeadingRenderer
23
23
 
24
- - (void)renderNode:(MarkdownASTNode *)node into:(NSMutableAttributedString *)output context:(RenderContext *)context
24
+ - (id)takeContextSnapshot:(RenderContext *)context
25
25
  {
26
+ return [context snapshotScope];
27
+ }
28
+
29
+ - (void)renderNodeContent:(MarkdownASTNode *)node
30
+ into:(NSMutableAttributedString *)output
31
+ context:(RenderContext *)context
32
+ {
33
+ if (output.length > 0 && ![output.string hasSuffix:@"\n"]) {
34
+ [output appendAttributedString:kNewlineAttributedString];
35
+ }
36
+
26
37
  NSInteger level = [node.attributes[@"level"] integerValue];
27
38
  if (level < 1 || level > 6)
28
39
  level = 1;
@@ -40,11 +51,7 @@ static NSString *const kHeadingTypes[] = {nil, @"heading-1", @"heading-
40
51
  start += offset;
41
52
  }
42
53
 
43
- @try {
44
- [_rendererFactory renderChildrenOfNode:node into:output context:context];
45
- } @finally {
46
- [context clearBlockStyle];
47
- }
54
+ [_rendererFactory renderChildrenOfNode:node into:output context:context];
48
55
 
49
56
  NSRange range = NSMakeRange(start, output.length - start);
50
57
  if (range.length == 0)
@@ -3,5 +3,5 @@
3
3
 
4
4
  extern NSString *const HighlightAttributeName;
5
5
 
6
- @interface HighlightRenderer : BaseRenderer <NodeRenderer>
6
+ @interface HighlightRenderer : BaseRenderer
7
7
  @end
@@ -10,7 +10,9 @@ NSString *const HighlightAttributeName = @"EnrichedMarkdownHighlight";
10
10
 
11
11
  #pragma mark - Rendering
12
12
 
13
- - (void)renderNode:(MarkdownASTNode *)node into:(NSMutableAttributedString *)output context:(RenderContext *)context
13
+ - (void)renderNodeContent:(MarkdownASTNode *)node
14
+ into:(NSMutableAttributedString *)output
15
+ context:(RenderContext *)context
14
16
  {
15
17
  NSUInteger start = output.length;
16
18
  [_rendererFactory renderChildrenOfNode:node into:output context:context];
@@ -2,5 +2,5 @@
2
2
  #import "MarkdownASTNode.h"
3
3
  #import "RenderContext.h"
4
4
 
5
- @interface LinkRenderer : BaseRenderer <NodeRenderer>
5
+ @interface LinkRenderer : BaseRenderer
6
6
  @end
@@ -9,7 +9,9 @@
9
9
 
10
10
  #pragma mark - Rendering
11
11
 
12
- - (void)renderNode:(MarkdownASTNode *)node into:(NSMutableAttributedString *)output context:(RenderContext *)context
12
+ - (void)renderNodeContent:(MarkdownASTNode *)node
13
+ into:(NSMutableAttributedString *)output
14
+ context:(RenderContext *)context
13
15
  {
14
16
  NSUInteger start = output.length;
15
17
 
@@ -1,12 +1,24 @@
1
1
  #import "BaseRenderer.h"
2
+ #import "RenderContext.h"
2
3
 
3
4
  extern NSString *const ListDepthAttribute;
4
5
  extern NSString *const ListTypeAttribute;
5
6
  extern NSString *const ListItemNumberAttribute;
7
+ extern NSString *const ListItemMarkerStartAttribute;
6
8
 
7
9
  extern NSString *const TaskItemAttribute;
8
10
  extern NSString *const TaskCheckedAttribute;
9
11
  extern NSString *const TaskIndexAttribute;
10
12
 
11
- @interface ListItemRenderer : BaseRenderer <NodeRenderer>
13
+ @interface ENRMListMarkerDescriptor : NSObject
14
+ @property (nonatomic, assign) BOOL isTask;
15
+ @property (nonatomic, assign) BOOL isChecked;
16
+ @property (nonatomic, assign) NSInteger taskIndex;
17
+ @property (nonatomic, assign) ListType listType;
18
+ @property (nonatomic, assign) NSInteger number;
19
+ @property (nonatomic, assign) NSInteger depth;
20
+ @property (nonatomic, assign) CGFloat indent;
21
+ @end
22
+
23
+ @interface ListItemRenderer : BaseRenderer
12
24
  @end