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
@@ -3,11 +3,16 @@
3
3
 
4
4
  @class RendererFactory;
5
5
  @class StyleConfig;
6
+ @class RenderContext;
7
+ @class MarkdownASTNode;
6
8
 
7
9
  /// Shared base for all node renderers — provides `_rendererFactory` and `_config`
8
10
  /// as protected ivars and the common designated initializer.
9
- /// Concrete subclasses must implement `renderNode:into:context:`.
10
- @interface BaseRenderer : NSObject {
11
+ /// `renderNode:into:context:` is a template method: take context snapshot ->
12
+ /// `renderNodeContent:into:context:` -> restore snapshot. Subclasses implement
13
+ /// `renderNodeContent:into:context:` and, when they mutate scoped context state,
14
+ /// override `takeContextSnapshot:` to return `[context snapshotScope]`.
15
+ @interface BaseRenderer : NSObject <NodeRenderer> {
11
16
  @protected
12
17
  __weak RendererFactory *_rendererFactory;
13
18
  StyleConfig *_config;
@@ -15,4 +20,14 @@
15
20
 
16
21
  - (instancetype)initWithRendererFactory:(id)rendererFactory config:(id)config;
17
22
 
23
+ - (void)renderNodeContent:(MarkdownASTNode *)node
24
+ into:(NSMutableAttributedString *)output
25
+ context:(RenderContext *)context;
26
+
27
+ /// Default returns nil.
28
+ - (nullable id)takeContextSnapshot:(RenderContext *)context;
29
+
30
+ /// Default restores a scope frame when snapshot is non-nil, no-op otherwise.
31
+ - (void)restoreContextSnapshot:(nullable id)snapshot context:(RenderContext *)context;
32
+
18
33
  @end
@@ -1,4 +1,5 @@
1
1
  #import "BaseRenderer.h"
2
+ #import "RenderContext.h"
2
3
  #import "RendererFactory.h"
3
4
  #import "StyleConfig.h"
4
5
 
@@ -13,4 +14,33 @@
13
14
  return self;
14
15
  }
15
16
 
17
+ - (void)renderNode:(MarkdownASTNode *)node into:(NSMutableAttributedString *)output context:(RenderContext *)context
18
+ {
19
+ id snapshot = [self takeContextSnapshot:context];
20
+ @try {
21
+ [self renderNodeContent:node into:output context:context];
22
+ } @finally {
23
+ [self restoreContextSnapshot:snapshot context:context];
24
+ }
25
+ }
26
+
27
+ - (void)renderNodeContent:(MarkdownASTNode *)node
28
+ into:(NSMutableAttributedString *)output
29
+ context:(RenderContext *)context
30
+ {
31
+ [self doesNotRecognizeSelector:_cmd];
32
+ }
33
+
34
+ - (id)takeContextSnapshot:(RenderContext *)context
35
+ {
36
+ return nil;
37
+ }
38
+
39
+ - (void)restoreContextSnapshot:(id)snapshot context:(RenderContext *)context
40
+ {
41
+ if (snapshot) {
42
+ [context restoreScope:snapshot];
43
+ }
44
+ }
45
+
16
46
  @end
@@ -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) {
@@ -28,6 +30,7 @@
28
30
  attachment.mathTextColor = [_config inlineMathColor];
29
31
  attachment.containerPaddingVertical = [_config inlineMathPaddingVertical];
30
32
  attachment.bold = ENRMMathFontWeightIsBold([_config inlineMathFontWeight]);
33
+ attachment.glyphOverflow = [_config inlineMathGlyphOverflow];
31
34
 
32
35
  #if TARGET_OS_OSX
33
36
  // On macOS, NSLayoutManager uses self.image/self.bounds rather than calling
@@ -53,6 +56,8 @@
53
56
  for (MarkdownASTNode *child in node.children) {
54
57
  if (child.content.length > 0) {
55
58
  [buffer appendString:child.content];
59
+ } else if (child.type == MarkdownNodeTypeSoftBreak || child.type == MarkdownNodeTypeLineBreak) {
60
+ [buffer appendString:@" "];
56
61
  }
57
62
  }
58
63
  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