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

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (505) hide show
  1. package/README.md +54 -8
  2. package/ReactNativeEnrichedMarkdown.podspec +82 -73
  3. package/android/build.gradle +188 -1
  4. package/android/consumer-rules.pro +1 -1
  5. package/android/generated/java/com/facebook/react/viewmanagers/EnrichedMarkdownManagerDelegate.java +27 -0
  6. package/android/generated/java/com/facebook/react/viewmanagers/EnrichedMarkdownManagerInterface.java +7 -0
  7. package/android/generated/java/com/facebook/react/viewmanagers/EnrichedMarkdownTextInputManagerDelegate.java +24 -0
  8. package/android/generated/java/com/facebook/react/viewmanagers/EnrichedMarkdownTextInputManagerInterface.java +8 -0
  9. package/android/generated/java/com/facebook/react/viewmanagers/EnrichedMarkdownTextManagerDelegate.java +27 -0
  10. package/android/generated/java/com/facebook/react/viewmanagers/EnrichedMarkdownTextManagerInterface.java +7 -0
  11. package/android/generated/jni/react/renderer/components/EnrichedMarkdownTextSpec/EventEmitters.cpp +223 -0
  12. package/android/generated/jni/react/renderer/components/EnrichedMarkdownTextSpec/EventEmitters.h +183 -0
  13. package/android/generated/jni/react/renderer/components/EnrichedMarkdownTextSpec/Props.cpp +65 -0
  14. package/android/generated/jni/react/renderer/components/EnrichedMarkdownTextSpec/Props.h +1086 -61
  15. package/android/src/main/baseline-prof.txt +1 -1
  16. package/android/src/main/cpp/jni-adapter.cpp +74 -0
  17. package/android/src/main/java/com/swmansion/enriched/markdown/EnrichedMarkdown.kt +351 -13
  18. package/android/src/main/java/com/swmansion/enriched/markdown/EnrichedMarkdownInternalText.kt +62 -0
  19. package/android/src/main/java/com/swmansion/enriched/markdown/EnrichedMarkdownManager.kt +85 -0
  20. package/android/src/main/java/com/swmansion/enriched/markdown/EnrichedMarkdownText.kt +160 -1
  21. package/android/src/main/java/com/swmansion/enriched/markdown/EnrichedMarkdownTextLayoutManager.kt +10 -1
  22. package/android/src/main/java/com/swmansion/enriched/markdown/EnrichedMarkdownTextManager.kt +76 -0
  23. package/android/src/main/java/com/swmansion/enriched/markdown/MeasurementStore.kt +126 -10
  24. package/android/src/main/java/com/swmansion/enriched/markdown/events/CopyPressEvent.kt +24 -0
  25. package/android/src/main/java/com/swmansion/enriched/markdown/events/CopyRequestEvent.kt +28 -0
  26. package/android/src/main/java/com/swmansion/enriched/markdown/events/LinkLayoutEvent.kt +36 -0
  27. package/android/src/main/java/com/swmansion/enriched/markdown/events/SelectionChangeEvent.kt +43 -0
  28. package/android/src/main/java/com/swmansion/enriched/markdown/input/EnrichedMarkdownTextInputManager.kt +54 -4
  29. package/android/src/main/java/com/swmansion/enriched/markdown/input/EnrichedMarkdownTextInputView.kt +923 -462
  30. package/android/src/main/java/com/swmansion/enriched/markdown/input/MarkdownClipboard.kt +42 -0
  31. package/android/src/main/java/com/swmansion/enriched/markdown/input/editing/BlockEditCoordinator.kt +196 -0
  32. package/android/src/main/java/com/swmansion/enriched/markdown/input/editing/ClipboardCoordinator.kt +73 -0
  33. package/android/src/main/java/com/swmansion/enriched/markdown/input/editing/EditContext.kt +19 -0
  34. package/android/src/main/java/com/swmansion/enriched/markdown/input/editing/EditPipeline.kt +248 -0
  35. package/android/src/main/java/com/swmansion/enriched/markdown/input/editing/EditSession.kt +52 -0
  36. package/android/src/main/java/com/swmansion/enriched/markdown/input/editing/InputConnectionWrapper.kt +108 -7
  37. package/android/src/main/java/com/swmansion/enriched/markdown/input/editing/LinkCoordinator.kt +69 -0
  38. package/android/src/main/java/com/swmansion/enriched/markdown/input/editing/MarkdownTextWatcher.kt +3 -3
  39. package/android/src/main/java/com/swmansion/enriched/markdown/input/editing/MentionCoordinator.kt +118 -0
  40. package/android/src/main/java/com/swmansion/enriched/markdown/input/events/OnChangeStateEvent.kt +26 -0
  41. package/android/src/main/java/com/swmansion/enriched/markdown/input/events/OnContextMenuItemPressEvent.kt +26 -0
  42. package/android/src/main/java/com/swmansion/enriched/markdown/input/events/OnInputKeyPressEvent.kt +24 -0
  43. package/android/src/main/java/com/swmansion/enriched/markdown/input/events/OnPasteEvent.kt +24 -0
  44. package/android/src/main/java/com/swmansion/enriched/markdown/input/formatting/BlockStore.kt +254 -0
  45. package/android/src/main/java/com/swmansion/enriched/markdown/input/formatting/FormattingStore.kt +80 -87
  46. package/android/src/main/java/com/swmansion/enriched/markdown/input/formatting/InputFormatter.kt +109 -1
  47. package/android/src/main/java/com/swmansion/enriched/markdown/input/formatting/InputParser.kt +116 -22
  48. package/android/src/main/java/com/swmansion/enriched/markdown/input/formatting/MarkdownSerializer.kt +167 -38
  49. package/android/src/main/java/com/swmansion/enriched/markdown/input/formatting/RangeEditAdjustment.kt +149 -0
  50. package/android/src/main/java/com/swmansion/enriched/markdown/input/layout/InputEventEmitter.kt +66 -5
  51. package/android/src/main/java/com/swmansion/enriched/markdown/input/layout/InputMeasurementStore.kt +4 -2
  52. package/android/src/main/java/com/swmansion/enriched/markdown/input/model/BlockRange.kt +27 -0
  53. package/android/src/main/java/com/swmansion/enriched/markdown/input/model/BlockType.kt +48 -0
  54. package/android/src/main/java/com/swmansion/enriched/markdown/input/model/FormattingRange.kt +9 -4
  55. package/android/src/main/java/com/swmansion/enriched/markdown/input/model/InputFormatterStyle.kt +39 -2
  56. package/android/src/main/java/com/swmansion/enriched/markdown/input/model/MathAtom.kt +20 -0
  57. package/android/src/main/java/com/swmansion/enriched/markdown/input/model/MathChipStyle.kt +1 -1
  58. package/android/src/main/java/com/swmansion/enriched/markdown/input/model/MutableRangeBounds.kt +11 -0
  59. package/android/src/main/java/com/swmansion/enriched/markdown/input/spans/InputBulletSpan.kt +82 -0
  60. package/android/src/main/java/com/swmansion/enriched/markdown/input/spans/InputHeadingSpan.kt +58 -0
  61. package/android/src/main/java/com/swmansion/enriched/markdown/input/spans/InputListItemSpacingSpan.kt +37 -0
  62. package/android/src/main/java/com/swmansion/enriched/markdown/input/spans/InputOrderedListMarkerSpan.kt +63 -0
  63. package/android/src/main/java/com/swmansion/enriched/markdown/input/styles/BlockHandler.kt +54 -0
  64. package/android/src/main/java/com/swmansion/enriched/markdown/input/styles/HeadingBlockHandler.kt +27 -0
  65. package/android/src/main/java/com/swmansion/enriched/markdown/input/styles/OrderedListBlockHandler.kt +38 -0
  66. package/android/src/main/java/com/swmansion/enriched/markdown/input/styles/UnorderedListBlockHandler.kt +37 -0
  67. package/android/src/main/java/com/swmansion/enriched/markdown/input/toolbar/InputContextMenu.kt +8 -26
  68. package/android/src/main/java/com/swmansion/enriched/markdown/parser/MarkdownASTNode.kt +1 -0
  69. package/android/src/main/java/com/swmansion/enriched/markdown/parser/Parser.kt +1 -0
  70. package/android/src/main/java/com/swmansion/enriched/markdown/renderer/BlockStyleContext.kt +9 -2
  71. package/android/src/main/java/com/swmansion/enriched/markdown/renderer/BlockquoteRenderer.kt +100 -12
  72. package/android/src/main/java/com/swmansion/enriched/markdown/renderer/CodeBlockRenderer.kt +16 -1
  73. package/android/src/main/java/com/swmansion/enriched/markdown/renderer/HeadingRenderer.kt +4 -0
  74. package/android/src/main/java/com/swmansion/enriched/markdown/renderer/LinkRenderer.kt +37 -7
  75. package/android/src/main/java/com/swmansion/enriched/markdown/renderer/ListContextManager.kt +2 -1
  76. package/android/src/main/java/com/swmansion/enriched/markdown/renderer/ListItemRenderer.kt +74 -18
  77. package/android/src/main/java/com/swmansion/enriched/markdown/renderer/ListRenderer.kt +43 -4
  78. package/android/src/main/java/com/swmansion/enriched/markdown/renderer/NodeRenderer.kt +9 -1
  79. package/android/src/main/java/com/swmansion/enriched/markdown/renderer/SoftBreakRenderer.kt +16 -0
  80. package/android/src/main/java/com/swmansion/enriched/markdown/renderer/SpanStyleCache.kt +35 -28
  81. package/android/src/main/java/com/swmansion/enriched/markdown/spans/BaseListSpan.kt +24 -0
  82. package/android/src/main/java/com/swmansion/enriched/markdown/spans/BlockquoteSpan.kt +174 -24
  83. package/android/src/main/java/com/swmansion/enriched/markdown/spans/CodeBackgroundSpan.kt +20 -82
  84. package/android/src/main/java/com/swmansion/enriched/markdown/spans/CodeBlockSpan.kt +13 -16
  85. package/android/src/main/java/com/swmansion/enriched/markdown/spans/CodeSpan.kt +1 -1
  86. package/android/src/main/java/com/swmansion/enriched/markdown/spans/EmphasisSpan.kt +1 -1
  87. package/android/src/main/java/com/swmansion/enriched/markdown/spans/ImageSpan.kt +182 -46
  88. package/android/src/main/java/com/swmansion/enriched/markdown/spans/InlineChipPainter.kt +140 -0
  89. package/android/src/main/java/com/swmansion/enriched/markdown/spans/LinkChipSpans.kt +177 -0
  90. package/android/src/main/java/com/swmansion/enriched/markdown/spans/LinkSpan.kt +1 -6
  91. package/android/src/main/java/com/swmansion/enriched/markdown/spans/ListItemSpacingSpan.kt +33 -0
  92. package/android/src/main/java/com/swmansion/enriched/markdown/spans/ListMarkerAnchorSpan.kt +38 -0
  93. package/android/src/main/java/com/swmansion/enriched/markdown/spans/OrderedListSpan.kt +2 -0
  94. package/android/src/main/java/com/swmansion/enriched/markdown/spans/StrongSpan.kt +1 -1
  95. package/android/src/main/java/com/swmansion/enriched/markdown/spans/TaskListSpan.kt +3 -2
  96. package/android/src/main/java/com/swmansion/enriched/markdown/spans/UnorderedListSpan.kt +3 -2
  97. package/android/src/main/java/com/swmansion/enriched/markdown/styles/BlockquoteStyle.kt +6 -0
  98. package/android/src/main/java/com/swmansion/enriched/markdown/styles/CodeBlockStyle.kt +26 -0
  99. package/android/src/main/java/com/swmansion/enriched/markdown/styles/ImageStyle.kt +7 -1
  100. package/android/src/main/java/com/swmansion/enriched/markdown/styles/InlineMathStyle.kt +16 -1
  101. package/android/src/main/java/com/swmansion/enriched/markdown/styles/LinkStyle.kt +36 -1
  102. package/android/src/main/java/com/swmansion/enriched/markdown/styles/LinkVariantEntry.kt +7 -3
  103. package/android/src/main/java/com/swmansion/enriched/markdown/styles/ListStyle.kt +4 -1
  104. package/android/src/main/java/com/swmansion/enriched/markdown/styles/MathStyle.kt +3 -0
  105. package/android/src/main/java/com/swmansion/enriched/markdown/styles/StyleConfig.kt +13 -4
  106. package/android/src/main/java/com/swmansion/enriched/markdown/styles/TableStyle.kt +6 -0
  107. package/android/src/main/java/com/swmansion/enriched/markdown/utils/common/CodeBlockHighlighter.kt +90 -0
  108. package/android/src/main/java/com/swmansion/enriched/markdown/utils/common/CodeBlockNode.kt +57 -0
  109. package/android/src/main/java/com/swmansion/enriched/markdown/utils/common/FeatureFlags.kt +1 -0
  110. package/android/src/main/java/com/swmansion/enriched/markdown/utils/common/MarkdownSegment.kt +9 -0
  111. package/android/src/main/java/com/swmansion/enriched/markdown/utils/common/MarkdownViewManagerUtils.kt +84 -7
  112. package/android/src/main/java/com/swmansion/enriched/markdown/utils/common/ReadableMapExtensions.kt +3 -0
  113. package/android/src/main/java/com/swmansion/enriched/markdown/utils/common/RenderedSegment.kt +10 -0
  114. package/android/src/main/java/com/swmansion/enriched/markdown/utils/common/SegmentSignature.kt +1 -0
  115. package/android/src/main/java/com/swmansion/enriched/markdown/utils/common/StreamingMarkdownFilter.kt +83 -5
  116. package/android/src/main/java/com/swmansion/enriched/markdown/utils/common/serialization/MarkdownASTSerializer.kt +4 -0
  117. package/android/src/main/java/com/swmansion/enriched/markdown/utils/input/MarkdownStyleParser.kt +74 -44
  118. package/android/src/main/java/com/swmansion/enriched/markdown/utils/input/PasteTextUtils.kt +52 -0
  119. package/android/src/main/java/com/swmansion/enriched/markdown/utils/text/ImageCache.kt +26 -3
  120. package/android/src/main/java/com/swmansion/enriched/markdown/utils/text/ImageDownloader.kt +22 -9
  121. package/android/src/main/java/com/swmansion/enriched/markdown/utils/text/LocalImageLoader.kt +161 -0
  122. package/android/src/main/java/com/swmansion/enriched/markdown/utils/text/conversion/HTMLGenerator.kt +2 -1
  123. package/android/src/main/java/com/swmansion/enriched/markdown/utils/text/conversion/MarkdownExtractor.kt +6 -0
  124. package/android/src/main/java/com/swmansion/enriched/markdown/utils/text/extensions/TextPaintExtensions.kt +23 -0
  125. package/android/src/main/java/com/swmansion/enriched/markdown/utils/text/interaction/CheckboxTouchHelper.kt +7 -0
  126. package/android/src/main/java/com/swmansion/enriched/markdown/utils/text/interaction/TaskListTapUtils.kt +41 -21
  127. package/android/src/main/java/com/swmansion/enriched/markdown/utils/text/span/BlockSpacing.kt +15 -8
  128. package/android/src/main/java/com/swmansion/enriched/markdown/utils/text/view/HeadlessActionMode.kt +88 -0
  129. package/android/src/main/java/com/swmansion/enriched/markdown/utils/text/view/LinkLayoutCollector.kt +100 -0
  130. package/android/src/main/java/com/swmansion/enriched/markdown/utils/text/view/LinkLongPressMovementMethod.kt +58 -27
  131. package/android/src/main/java/com/swmansion/enriched/markdown/utils/text/view/SelectionActionMode.kt +72 -16
  132. package/android/src/main/java/com/swmansion/enriched/markdown/utils/text/view/SelectionChangeReporter.kt +232 -0
  133. package/android/src/main/java/com/swmansion/enriched/markdown/views/BlockMenuOptions.kt +64 -0
  134. package/android/src/main/java/com/swmansion/enriched/markdown/views/CodeBlockContainerView.kt +414 -0
  135. package/android/src/main/java/com/swmansion/enriched/markdown/views/ContextMenuPopup.kt +9 -6
  136. package/android/src/main/java/com/swmansion/enriched/markdown/views/CopyGlyph.kt +101 -0
  137. package/android/src/main/java/com/swmansion/enriched/markdown/views/TableContainerView.kt +61 -11
  138. package/android/src/main/jni/CMakeLists.txt +53 -0
  139. package/android/src/main/jni/react/renderer/components/EnrichedMarkdownTextSpec/MarkdownContainerShadowNode.cpp +10 -0
  140. package/android/src/main/jni/react/renderer/components/EnrichedMarkdownTextSpec/MarkdownContainerShadowNode.h +11 -2
  141. package/android/src/main/jni/react/renderer/components/EnrichedMarkdownTextSpec/MarkdownTextShadowNode.cpp +10 -0
  142. package/android/src/main/jni/react/renderer/components/EnrichedMarkdownTextSpec/MarkdownTextShadowNode.h +12 -2
  143. package/android/src/main/jni/react/renderer/components/EnrichedMarkdownTextSpec/MarkdownTextState.cpp +9 -0
  144. package/android/src/main/jni/react/renderer/components/EnrichedMarkdownTextSpec/MarkdownTextState.h +24 -0
  145. package/android/src/main/jni/react/renderer/components/EnrichedMarkdownTextSpec/conversions.h +16 -0
  146. package/android/src/math/java/com/swmansion/enriched/markdown/input/math/MathChipControllerImpl.kt +21 -4
  147. package/android/src/math/java/com/swmansion/enriched/markdown/renderer/MathInlineRenderer.kt +8 -2
  148. package/android/src/math/java/com/swmansion/enriched/markdown/spans/MathChipSpan.kt +1 -1
  149. package/android/src/math/java/com/swmansion/enriched/markdown/spans/MathInlineSpan.kt +13 -6
  150. package/android/src/math/java/com/swmansion/enriched/markdown/spans/MathMeasureHelper.kt +2 -1
  151. package/android/src/math/java/com/swmansion/enriched/markdown/views/MathContainerView.kt +26 -8
  152. package/cpp/highlight/CodeBlockHighlighter.cpp +284 -0
  153. package/cpp/highlight/CodeBlockHighlighter.hpp +66 -0
  154. package/cpp/highlight/CodeBlockLanguages.cpp +138 -0
  155. package/cpp/highlight/CodeBlockLanguages.hpp +25 -0
  156. package/cpp/highlight/HighlightGrammars.hpp +28 -0
  157. package/cpp/highlight/code_highlight_podspec.rb +211 -0
  158. package/cpp/highlight/gen-registry.mjs +155 -0
  159. package/cpp/highlight/grammar-versions.json +159 -0
  160. package/cpp/highlight/vendor/generated/generated_queries.h +1665 -0
  161. package/cpp/highlight/vendor/generated/generated_registry.cpp +59 -0
  162. package/cpp/parser/MD4CParser.cpp +173 -61
  163. package/cpp/parser/MD4CParser.hpp +1 -0
  164. package/cpp/parser/MarkdownASTNode.hpp +2 -1
  165. package/cpp/wasm/ASTSerializer.cpp +2 -0
  166. package/cpp/wasm/build.sh +1 -0
  167. package/cpp/wasm/md4c_wasm.cpp +3 -1
  168. package/docs/ACCESSIBILITY.md +14 -2
  169. package/docs/API_REFERENCE.md +405 -12
  170. package/docs/BREAKING_CHANGES.md +129 -0
  171. package/docs/CODE_HIGHLIGHT.md +133 -0
  172. package/docs/COPY_OPTIONS.md +61 -3
  173. package/docs/ELEMENTS_STRUCTURE.md +52 -4
  174. package/docs/IMAGE_CACHING.md +30 -0
  175. package/docs/INPUT.md +110 -11
  176. package/docs/LATEX_MATH.md +87 -45
  177. package/docs/MACOS.md +1 -1
  178. package/docs/MARKDOWN_STREAMING.md +27 -1
  179. package/docs/MENTIONS.md +8 -1
  180. package/docs/NATIVE_ASSETS.md +127 -0
  181. package/docs/RTL.md +1 -1
  182. package/docs/STYLES.md +73 -6
  183. package/docs/TESTING.md +112 -0
  184. package/docs/TEXT.md +18 -6
  185. package/docs/WEB.md +4 -1
  186. package/ios/EnrichedMarkdown.h +7 -0
  187. package/ios/EnrichedMarkdown.mm +583 -76
  188. package/ios/EnrichedMarkdownText.h +7 -0
  189. package/ios/EnrichedMarkdownText.mm +299 -73
  190. package/ios/attachments/ENRMImageAttachment.h +9 -0
  191. package/ios/attachments/ENRMImageAttachment.m +143 -40
  192. package/ios/attachments/ENRMMathInlineAttachment+macOS.m +2 -1
  193. package/ios/attachments/ENRMMathInlineAttachment.h +5 -0
  194. package/ios/attachments/ENRMMathInlineAttachment.m +50 -82
  195. package/ios/attachments/ENRMMathInlineAttachmentShared.h +2 -0
  196. package/ios/generated/ReactCodegen/EnrichedMarkdownTextSpec/EventEmitters.cpp +223 -0
  197. package/ios/generated/ReactCodegen/EnrichedMarkdownTextSpec/EventEmitters.h +183 -0
  198. package/ios/generated/ReactCodegen/EnrichedMarkdownTextSpec/Props.cpp +65 -0
  199. package/ios/generated/ReactCodegen/EnrichedMarkdownTextSpec/Props.h +1086 -61
  200. package/ios/generated/ReactCodegen/EnrichedMarkdownTextSpec/RCTComponentViewHelpers.h +181 -2
  201. package/ios/input/ENRMAutoLinkDetector.h +2 -1
  202. package/ios/input/ENRMAutoLinkDetector.mm +79 -41
  203. package/ios/input/ENRMBlockEditCoordinator.h +71 -0
  204. package/ios/input/ENRMBlockEditCoordinator.mm +195 -0
  205. package/ios/input/ENRMBlockRange.h +28 -0
  206. package/ios/input/ENRMBlockRange.mm +30 -0
  207. package/ios/input/ENRMBlockStore.h +56 -0
  208. package/ios/input/ENRMBlockStore.mm +275 -0
  209. package/ios/input/ENRMClipboardCoordinator.h +45 -0
  210. package/ios/input/ENRMClipboardCoordinator.mm +120 -0
  211. package/ios/input/ENRMDetectorPipeline.h +2 -1
  212. package/ios/input/ENRMEditPipeline.h +76 -0
  213. package/ios/input/ENRMEditPipeline.mm +228 -0
  214. package/ios/input/ENRMEditSession.h +36 -0
  215. package/ios/input/ENRMEditSession.mm +63 -0
  216. package/ios/input/ENRMFormattingStore.h +17 -0
  217. package/ios/input/ENRMFormattingStore.mm +95 -105
  218. package/ios/input/ENRMInputBlockType.h +91 -0
  219. package/ios/input/ENRMInputBlockType.mm +5 -0
  220. package/ios/input/ENRMInputDecorationDrawer.h +18 -0
  221. package/ios/input/ENRMInputEventEmitter.h +56 -0
  222. package/ios/input/ENRMInputEventEmitter.mm +308 -0
  223. package/ios/input/ENRMInputFormatter.h +29 -69
  224. package/ios/input/ENRMInputFormatter.mm +216 -124
  225. package/ios/input/ENRMInputFormatterStyle.h +99 -0
  226. package/ios/input/ENRMInputFormatterStyle.mm +188 -0
  227. package/ios/input/ENRMInputLayoutManager.h +9 -0
  228. package/ios/input/ENRMInputLayoutManager.mm +30 -0
  229. package/ios/input/ENRMInputListMarkerDrawer.h +32 -0
  230. package/ios/input/ENRMInputListMarkerDrawer.mm +426 -0
  231. package/ios/input/ENRMInputParser.h +5 -6
  232. package/ios/input/ENRMInputParser.mm +461 -178
  233. package/ios/input/ENRMInputRemend.mm +2 -2
  234. package/ios/input/ENRMInputStyleStateBuilder.h +40 -0
  235. package/ios/input/ENRMInputStyleStateBuilder.mm +60 -0
  236. package/ios/input/ENRMInputTextView.mm +103 -8
  237. package/ios/input/ENRMInputTypingAttributesController.h +42 -0
  238. package/ios/input/ENRMInputTypingAttributesController.mm +203 -0
  239. package/ios/input/ENRMLinkCoordinator.h +41 -0
  240. package/ios/input/ENRMLinkCoordinator.mm +89 -0
  241. package/ios/input/ENRMMarkdownSerializer.h +29 -5
  242. package/ios/input/ENRMMarkdownSerializer.mm +170 -48
  243. package/ios/input/ENRMMathAtom.h +26 -0
  244. package/ios/input/ENRMMathAtom.mm +12 -0
  245. package/ios/input/ENRMMentionCoordinator.h +45 -0
  246. package/ios/input/ENRMMentionCoordinator.mm +167 -0
  247. package/ios/input/ENRMRangeEditAdjustment.h +38 -0
  248. package/ios/input/ENRMRangeEditAdjustment.mm +91 -0
  249. package/ios/input/ENRMRangeStoreUtils.h +39 -0
  250. package/ios/input/EnrichedMarkdownTextInput+ContextMenu.mm +6 -6
  251. package/ios/input/EnrichedMarkdownTextInput+Internal.h +11 -3
  252. package/ios/input/EnrichedMarkdownTextInput.h +7 -1
  253. package/ios/input/EnrichedMarkdownTextInput.mm +1089 -1023
  254. package/ios/input/InputStylePropsUtils.h +109 -68
  255. package/ios/input/internals/EnrichedMarkdownTextInputShadowNode.mm +2 -1
  256. package/ios/input/styles/ENRMBlockHandler.h +46 -0
  257. package/ios/input/styles/ENRMHeadingBlockHandler.h +15 -0
  258. package/ios/input/styles/ENRMHeadingBlockHandler.mm +38 -0
  259. package/ios/input/styles/ENRMOrderedListBlockHandler.h +14 -0
  260. package/ios/input/styles/ENRMOrderedListBlockHandler.mm +48 -0
  261. package/ios/input/styles/ENRMUnorderedListBlockHandler.h +15 -0
  262. package/ios/input/styles/ENRMUnorderedListBlockHandler.mm +51 -0
  263. package/ios/internals/ENRMViewFreeMeasurement.h +331 -0
  264. package/ios/internals/EnrichedMarkdownShadowNode.h +1 -3
  265. package/ios/internals/EnrichedMarkdownShadowNode.mm +16 -20
  266. package/ios/internals/EnrichedMarkdownTextShadowNode.h +1 -3
  267. package/ios/internals/EnrichedMarkdownTextShadowNode.mm +15 -20
  268. package/ios/internals/MeasurementCache.h +41 -9
  269. package/ios/internals/ShadowMeasurementUtils.h +63 -58
  270. package/ios/math/ENRMMathChipController.h +74 -0
  271. package/ios/math/ENRMMathChipController.mm +476 -0
  272. package/ios/math/ENRMRaTeXBridge.swift +27 -6
  273. package/ios/parser/ENRMMarkdownParser.h +1 -8
  274. package/ios/parser/ENRMMarkdownParser.mm +2 -11
  275. package/ios/parser/MarkdownASTNode.h +2 -1
  276. package/ios/parser/MarkdownParserBridge.mm +4 -0
  277. package/ios/renderer/AttributedRenderer.m +20 -2
  278. package/ios/renderer/BaseRenderer.h +17 -2
  279. package/ios/renderer/BaseRenderer.m +30 -0
  280. package/ios/renderer/BlockquoteRenderer.h +1 -1
  281. package/ios/renderer/BlockquoteRenderer.m +144 -35
  282. package/ios/renderer/CodeBlockRenderer.h +1 -1
  283. package/ios/renderer/CodeBlockRenderer.m +27 -23
  284. package/ios/renderer/CodeRenderer.h +1 -1
  285. package/ios/renderer/CodeRenderer.m +3 -1
  286. package/ios/renderer/ENRMImageRenderer.h +1 -1
  287. package/ios/renderer/ENRMImageRenderer.m +5 -1
  288. package/ios/renderer/ENRMMathInlineRenderer.h +1 -1
  289. package/ios/renderer/ENRMMathInlineRenderer.m +6 -1
  290. package/ios/renderer/ENRMSpoilerRenderer.h +1 -1
  291. package/ios/renderer/ENRMSpoilerRenderer.m +3 -1
  292. package/ios/renderer/EmphasisRenderer.h +1 -1
  293. package/ios/renderer/EmphasisRenderer.m +3 -1
  294. package/ios/renderer/HeadingRenderer.h +1 -1
  295. package/ios/renderer/HeadingRenderer.m +13 -6
  296. package/ios/renderer/HighlightRenderer.h +1 -1
  297. package/ios/renderer/HighlightRenderer.m +3 -1
  298. package/ios/renderer/LinkRenderer.h +1 -1
  299. package/ios/renderer/LinkRenderer.m +50 -16
  300. package/ios/renderer/ListItemRenderer.h +13 -1
  301. package/ios/renderer/ListItemRenderer.m +102 -44
  302. package/ios/renderer/ListRenderer.h +2 -2
  303. package/ios/renderer/ListRenderer.m +63 -25
  304. package/ios/renderer/ParagraphRenderer.h +1 -1
  305. package/ios/renderer/ParagraphRenderer.m +16 -8
  306. package/ios/renderer/RenderContext.h +10 -0
  307. package/ios/renderer/RenderContext.m +44 -0
  308. package/ios/renderer/RendererFactory.m +14 -0
  309. package/ios/renderer/StrikethroughRenderer.h +1 -1
  310. package/ios/renderer/StrikethroughRenderer.m +3 -1
  311. package/ios/renderer/StrongRenderer.h +1 -1
  312. package/ios/renderer/StrongRenderer.m +3 -1
  313. package/ios/renderer/SubscriptRenderer.h +1 -1
  314. package/ios/renderer/SubscriptRenderer.m +3 -1
  315. package/ios/renderer/SuperscriptRenderer.h +1 -1
  316. package/ios/renderer/SuperscriptRenderer.m +3 -1
  317. package/ios/renderer/TextRenderer.h +2 -2
  318. package/ios/renderer/TextRenderer.m +3 -1
  319. package/ios/renderer/ThematicBreakRenderer.h +1 -1
  320. package/ios/renderer/ThematicBreakRenderer.m +3 -1
  321. package/ios/renderer/UnderlineRenderer.h +1 -1
  322. package/ios/renderer/UnderlineRenderer.m +3 -1
  323. package/ios/styles/StyleConfig.h +42 -0
  324. package/ios/styles/StyleConfig.mm +216 -0
  325. package/ios/utils/BlockquoteBorder.h +6 -0
  326. package/ios/utils/BlockquoteBorder.m +249 -52
  327. package/ios/utils/CodeBackground.m +3 -65
  328. package/ios/utils/CodeBlockBackground.m +16 -2
  329. package/ios/utils/ENRMAtomicSize.h +65 -0
  330. package/ios/utils/ENRMBlockMenu.h +66 -0
  331. package/ios/utils/ENRMChipDrawing.h +24 -0
  332. package/ios/utils/ENRMChipDrawing.m +83 -0
  333. package/ios/utils/ENRMCodeBlockContent.h +37 -0
  334. package/ios/utils/ENRMCodeBlockContent.mm +79 -0
  335. package/ios/utils/ENRMCodeBlockHighlighter.h +37 -0
  336. package/ios/utils/ENRMCodeBlockHighlighter.mm +51 -0
  337. package/ios/utils/ENRMFeatureFlags.h +7 -0
  338. package/ios/utils/ENRMImageDownloader.h +11 -1
  339. package/ios/utils/ENRMImageDownloader.m +60 -16
  340. package/ios/utils/ENRMLinkChip.h +70 -0
  341. package/ios/utils/ENRMLinkChip.m +213 -0
  342. package/ios/utils/ENRMLinkLayout.h +50 -0
  343. package/ios/utils/ENRMLinkLayout.m +45 -0
  344. package/ios/utils/ENRMLocalImageLoader.h +31 -0
  345. package/ios/utils/ENRMLocalImageLoader.m +68 -0
  346. package/ios/utils/ENRMMathFallback.h +26 -0
  347. package/ios/utils/ENRMMathFallback.m +18 -0
  348. package/ios/utils/ENRMSelectionChange.h +120 -0
  349. package/ios/utils/ENRMSelectionChange.m +282 -0
  350. package/ios/utils/ENRMTextViewSetup.h +35 -17
  351. package/ios/utils/EditMenuUtils+macOS.m +4 -1
  352. package/ios/utils/EditMenuUtils.h +35 -6
  353. package/ios/utils/EditMenuUtils.m +188 -11
  354. package/ios/utils/HTMLGenerator.m +2 -1
  355. package/ios/utils/ImageRequestHeaderUtils.h +35 -0
  356. package/ios/utils/LastElementUtils.h +1 -0
  357. package/ios/utils/ListMarkerDrawer.m +29 -42
  358. package/ios/utils/MarkdownASTSerializer.m +4 -0
  359. package/ios/utils/MarkdownAccessibilityElementBuilder.m +3 -1
  360. package/ios/utils/MarkdownExtractor.m +2 -1
  361. package/ios/utils/ParagraphStyleUtils.h +5 -0
  362. package/ios/utils/ParagraphStyleUtils.m +77 -17
  363. package/ios/utils/RTFExportUtils.m +2 -0
  364. package/ios/utils/RenderedMarkdownSegment.h +13 -1
  365. package/ios/utils/RenderedMarkdownSegment.m +20 -0
  366. package/ios/utils/SegmentRenderer.m +17 -4
  367. package/ios/utils/StreamingMarkdownFilter.h +11 -1
  368. package/ios/utils/StreamingMarkdownFilter.m +98 -2
  369. package/ios/utils/StylePropsUtils.h +110 -1
  370. package/ios/utils/TaskListTapUtils.m +24 -0
  371. package/ios/utils/TextViewLayoutManager.mm +3 -0
  372. package/ios/views/ENRMCodeBlockContainerView.h +60 -0
  373. package/ios/views/ENRMCodeBlockContainerView.m +569 -0
  374. package/ios/views/ENRMMathContainerView.h +23 -0
  375. package/ios/views/ENRMMathContainerView.m +87 -20
  376. package/ios/views/TableContainerView.h +32 -0
  377. package/ios/views/TableContainerView.m +291 -175
  378. package/jest.d.ts +1 -0
  379. package/jest.js +5 -0
  380. package/lib/module/EnrichedMarkdownNativeComponent.ts +203 -1
  381. package/lib/module/EnrichedMarkdownTextInput.js +84 -5
  382. package/lib/module/EnrichedMarkdownTextInput.js.map +1 -1
  383. package/lib/module/EnrichedMarkdownTextInputNativeComponent.ts +78 -5
  384. package/lib/module/EnrichedMarkdownTextNativeComponent.ts +204 -1
  385. package/lib/module/headingDefaults.js +34 -0
  386. package/lib/module/headingDefaults.js.map +1 -0
  387. package/lib/module/index.js.map +1 -1
  388. package/lib/module/jest/index.js +205 -0
  389. package/lib/module/jest/index.js.map +1 -0
  390. package/lib/module/native/EnrichedMarkdownText.js +199 -15
  391. package/lib/module/native/EnrichedMarkdownText.js.map +1 -1
  392. package/lib/module/normalizeMarkdownStyle.js +98 -23
  393. package/lib/module/normalizeMarkdownStyle.js.map +1 -1
  394. package/lib/module/normalizeMarkdownStyle.web.js +73 -22
  395. package/lib/module/normalizeMarkdownStyle.web.js.map +1 -1
  396. package/lib/module/normalizeMarkdownTextInputStyle.js +62 -15
  397. package/lib/module/normalizeMarkdownTextInputStyle.js.map +1 -1
  398. package/lib/module/normalizeMenuItem.js +1 -1
  399. package/lib/module/utils/textInputState.js +26 -0
  400. package/lib/module/utils/textInputState.js.map +1 -0
  401. package/lib/module/web/EnrichedMarkdownText.js +15 -8
  402. package/lib/module/web/EnrichedMarkdownText.js.map +1 -1
  403. package/lib/module/web/parseMarkdown.js +4 -3
  404. package/lib/module/web/parseMarkdown.js.map +1 -1
  405. package/lib/module/web/renderers/InlineRenderers.js +102 -3
  406. package/lib/module/web/renderers/InlineRenderers.js.map +1 -1
  407. package/lib/module/web/renderers/ListRenderers.js +7 -2
  408. package/lib/module/web/renderers/ListRenderers.js.map +1 -1
  409. package/lib/module/web/renderers/index.js +7 -4
  410. package/lib/module/web/renderers/index.js.map +1 -1
  411. package/lib/module/web/styles.js +101 -6
  412. package/lib/module/web/styles.js.map +1 -1
  413. package/lib/module/web/utils.js +14 -0
  414. package/lib/module/web/utils.js.map +1 -1
  415. package/lib/module/web/wasm/md4c.js +0 -0
  416. package/lib/module/web/wasm/md4c.js.map +1 -1
  417. package/lib/typescript/src/EnrichedMarkdownNativeComponent.d.ts +185 -2
  418. package/lib/typescript/src/EnrichedMarkdownNativeComponent.d.ts.map +1 -1
  419. package/lib/typescript/src/EnrichedMarkdownTextInput.d.ts +94 -9
  420. package/lib/typescript/src/EnrichedMarkdownTextInput.d.ts.map +1 -1
  421. package/lib/typescript/src/EnrichedMarkdownTextInputNativeComponent.d.ts +69 -5
  422. package/lib/typescript/src/EnrichedMarkdownTextInputNativeComponent.d.ts.map +1 -1
  423. package/lib/typescript/src/EnrichedMarkdownTextNativeComponent.d.ts +185 -2
  424. package/lib/typescript/src/EnrichedMarkdownTextNativeComponent.d.ts.map +1 -1
  425. package/lib/typescript/src/headingDefaults.d.ts +9 -0
  426. package/lib/typescript/src/headingDefaults.d.ts.map +1 -0
  427. package/lib/typescript/src/index.d.ts +3 -3
  428. package/lib/typescript/src/index.d.ts.map +1 -1
  429. package/lib/typescript/src/index.web.d.ts +2 -2
  430. package/lib/typescript/src/index.web.d.ts.map +1 -1
  431. package/lib/typescript/src/jest/index.d.ts +6 -0
  432. package/lib/typescript/src/jest/index.d.ts.map +1 -0
  433. package/lib/typescript/src/native/EnrichedMarkdownText.d.ts +5 -5
  434. package/lib/typescript/src/native/EnrichedMarkdownText.d.ts.map +1 -1
  435. package/lib/typescript/src/normalizeMarkdownStyle.d.ts.map +1 -1
  436. package/lib/typescript/src/normalizeMarkdownStyle.web.d.ts.map +1 -1
  437. package/lib/typescript/src/normalizeMarkdownTextInputStyle.d.ts +19 -5
  438. package/lib/typescript/src/normalizeMarkdownTextInputStyle.d.ts.map +1 -1
  439. package/lib/typescript/src/types/MarkdownStyle.d.ts +122 -5
  440. package/lib/typescript/src/types/MarkdownStyle.d.ts.map +1 -1
  441. package/lib/typescript/src/types/MarkdownStyleInternal.d.ts +39 -0
  442. package/lib/typescript/src/types/MarkdownStyleInternal.d.ts.map +1 -1
  443. package/lib/typescript/src/types/MarkdownTextProps.d.ts +207 -10
  444. package/lib/typescript/src/types/MarkdownTextProps.d.ts.map +1 -1
  445. package/lib/typescript/src/types/MarkdownTextProps.web.d.ts +60 -1
  446. package/lib/typescript/src/types/MarkdownTextProps.web.d.ts.map +1 -1
  447. package/lib/typescript/src/types/events.d.ts +85 -0
  448. package/lib/typescript/src/types/events.d.ts.map +1 -1
  449. package/lib/typescript/src/utils/textInputState.d.ts +24 -0
  450. package/lib/typescript/src/utils/textInputState.d.ts.map +1 -0
  451. package/lib/typescript/src/web/EnrichedMarkdownText.d.ts +1 -1
  452. package/lib/typescript/src/web/EnrichedMarkdownText.d.ts.map +1 -1
  453. package/lib/typescript/src/web/parseMarkdown.d.ts +1 -1
  454. package/lib/typescript/src/web/parseMarkdown.d.ts.map +1 -1
  455. package/lib/typescript/src/web/renderers/InlineRenderers.d.ts.map +1 -1
  456. package/lib/typescript/src/web/renderers/ListRenderers.d.ts.map +1 -1
  457. package/lib/typescript/src/web/renderers/index.d.ts +2 -1
  458. package/lib/typescript/src/web/renderers/index.d.ts.map +1 -1
  459. package/lib/typescript/src/web/styles.d.ts +2 -1
  460. package/lib/typescript/src/web/styles.d.ts.map +1 -1
  461. package/lib/typescript/src/web/types.d.ts +10 -2
  462. package/lib/typescript/src/web/types.d.ts.map +1 -1
  463. package/lib/typescript/src/web/utils.d.ts +4 -0
  464. package/lib/typescript/src/web/utils.d.ts.map +1 -1
  465. package/package.json +36 -9
  466. package/postinstall.mjs +131 -0
  467. package/ratex-version.json +21 -0
  468. package/src/EnrichedMarkdownNativeComponent.ts +203 -1
  469. package/src/EnrichedMarkdownTextInput.tsx +159 -8
  470. package/src/EnrichedMarkdownTextInputNativeComponent.ts +78 -5
  471. package/src/EnrichedMarkdownTextNativeComponent.ts +204 -1
  472. package/src/headingDefaults.ts +21 -0
  473. package/src/index.tsx +15 -0
  474. package/src/index.web.tsx +6 -1
  475. package/src/jest/index.tsx +236 -0
  476. package/src/native/EnrichedMarkdownText.tsx +260 -11
  477. package/src/normalizeMarkdownStyle.ts +117 -16
  478. package/src/normalizeMarkdownStyle.web.ts +76 -15
  479. package/src/normalizeMarkdownTextInputStyle.ts +110 -35
  480. package/src/normalizeMenuItem.ts +1 -1
  481. package/src/types/MarkdownStyle.ts +125 -5
  482. package/src/types/MarkdownStyleInternal.ts +51 -0
  483. package/src/types/MarkdownTextProps.ts +215 -10
  484. package/src/types/MarkdownTextProps.web.ts +62 -1
  485. package/src/types/events.ts +90 -0
  486. package/src/utils/textInputState.ts +35 -0
  487. package/src/web/EnrichedMarkdownText.tsx +26 -5
  488. package/src/web/parseMarkdown.ts +6 -2
  489. package/src/web/renderers/InlineRenderers.tsx +116 -3
  490. package/src/web/renderers/ListRenderers.tsx +14 -2
  491. package/src/web/renderers/index.tsx +6 -2
  492. package/src/web/styles.ts +114 -5
  493. package/src/web/types.ts +10 -1
  494. package/src/web/utils.ts +9 -0
  495. package/src/web/wasm/md4c.js +0 -0
  496. package/vendor-grammars.mjs +511 -0
  497. package/vendor-ratex.mjs +173 -0
  498. package/app.plugin.js +0 -2
  499. package/plugin/build/withAndroidMath.js +0 -19
  500. package/plugin/build/withIosMath.js +0 -28
  501. package/plugin/build/withReactNativeEnrichedMarkdown.js +0 -11
  502. package/plugin/src/withAndroidMath.ts +0 -24
  503. package/plugin/src/withIosMath.ts +0 -35
  504. package/plugin/src/withReactNativeEnrichedMarkdown.ts +0 -17
  505. package/plugin/tsconfig.build.json +0 -16
@@ -0,0 +1,284 @@
1
+ #include "CodeBlockHighlighter.hpp"
2
+
3
+ // Stub compiled when the syntax highlighting module is disabled. The real
4
+ // implementation defines the same symbol under ENRICHED_MARKDOWN_CODE_HIGHLIGHT,
5
+ // so exactly one definition exists in any build configuration.
6
+
7
+ #if !defined(ENRICHED_MARKDOWN_CODE_HIGHLIGHT)
8
+
9
+ namespace Markdown {
10
+
11
+ std::vector<HighlightToken> highlightCode(const std::string & /*code*/, const std::string & /*language*/) {
12
+ return {};
13
+ }
14
+
15
+ } // namespace Markdown
16
+
17
+ #else
18
+
19
+ #include "CodeBlockLanguages.hpp"
20
+ #include "HighlightGrammars.hpp"
21
+
22
+ #include <tree_sitter/api.h>
23
+
24
+ #include <algorithm>
25
+ #include <cstring>
26
+ #include <memory>
27
+ #include <mutex>
28
+ #include <unordered_map>
29
+
30
+ namespace Markdown {
31
+
32
+ namespace {
33
+
34
+ // Bounds the synchronous main-thread parse against pathological inputs. Typical
35
+ // blocks parse in sub-millisecond to low-millisecond time; anything past these
36
+ // caps falls back to plain rendering instead of risking a frame hang.
37
+ constexpr size_t kMaxBytes = 50u * 1024u;
38
+ constexpr size_t kMaxLines = 2000u;
39
+
40
+ // tree-sitter highlight capture names, flattened to their leading dotted
41
+ // prefix. The longest matching prefix wins, so "variable.member" resolves to
42
+ // Property while a bare "variable" resolves to Variable. Names with no entry
43
+ // (for example "spell", "none") are skipped and leave their bytes uncolored.
44
+ struct CaptureMapping {
45
+ const char *prefix;
46
+ HighlightTokenType type;
47
+ };
48
+
49
+ constexpr CaptureMapping kCaptureMappings[] = {
50
+ {"keyword", HighlightTokenType::Keyword},
51
+ {"operator", HighlightTokenType::Operator},
52
+ {"punctuation", HighlightTokenType::Punctuation},
53
+ {"string", HighlightTokenType::String},
54
+ {"escape", HighlightTokenType::String},
55
+ {"character", HighlightTokenType::String},
56
+ {"number", HighlightTokenType::Number},
57
+ {"float", HighlightTokenType::Number},
58
+ {"boolean", HighlightTokenType::Constant},
59
+ {"constant", HighlightTokenType::Constant},
60
+ {"comment", HighlightTokenType::Comment},
61
+ {"function", HighlightTokenType::Function},
62
+ {"method", HighlightTokenType::Function},
63
+ {"constructor", HighlightTokenType::Type},
64
+ {"type", HighlightTokenType::Type},
65
+ {"module", HighlightTokenType::Type},
66
+ {"namespace", HighlightTokenType::Type},
67
+ {"variable", HighlightTokenType::Variable},
68
+ {"parameter", HighlightTokenType::Variable},
69
+ {"variable.member", HighlightTokenType::Property},
70
+ {"property", HighlightTokenType::Property},
71
+ {"field", HighlightTokenType::Property},
72
+ {"tag", HighlightTokenType::Tag},
73
+ {"attribute", HighlightTokenType::Attribute},
74
+ {"embedded", HighlightTokenType::Embedded},
75
+ {"injection", HighlightTokenType::Embedded},
76
+ };
77
+
78
+ // A capture name matches a prefix only on dotted boundaries so "type" never
79
+ // swallows "typename"-style names. Returns false when nothing maps.
80
+ bool mapCaptureName(const char *name, uint32_t length, HighlightTokenType &out) {
81
+ size_t best = 0;
82
+ bool found = false;
83
+ for (const CaptureMapping &m : kCaptureMappings) {
84
+ size_t plen = std::strlen(m.prefix);
85
+ if (plen > length || plen < best) {
86
+ continue;
87
+ }
88
+ if (std::strncmp(name, m.prefix, plen) != 0) {
89
+ continue;
90
+ }
91
+ if (plen != length && name[plen] != '.') {
92
+ continue;
93
+ }
94
+ best = plen;
95
+ out = m.type;
96
+ found = true;
97
+ }
98
+ return found;
99
+ }
100
+
101
+ // Compiled queries are immutable after creation and reused across calls. Access
102
+ // is serialized on the main thread today; the mutex is cheap insurance should
103
+ // highlighting ever move off-main. A cached nullptr marks a query that failed to
104
+ // compile so it is not retried.
105
+ TSQuery *queryForLanguage(const TSLanguage *language, const char *source) {
106
+ static std::mutex mutex;
107
+ static std::unordered_map<const TSLanguage *, TSQuery *> cache;
108
+
109
+ std::lock_guard<std::mutex> lock(mutex);
110
+ auto it = cache.find(language);
111
+ if (it != cache.end()) {
112
+ return it->second;
113
+ }
114
+
115
+ uint32_t errorOffset = 0;
116
+ TSQueryError errorType = TSQueryErrorNone;
117
+ TSQuery *query = ts_query_new(language, source, static_cast<uint32_t>(std::strlen(source)), &errorOffset, &errorType);
118
+ cache.emplace(language, query);
119
+ return query;
120
+ }
121
+
122
+ // Precomputes, for every byte offset that starts a code point, the number of
123
+ // UTF-16 code units preceding it. Token boundaries always land on code-point
124
+ // boundaries, so mapping a byte offset is a single lookup. Astral code points
125
+ // (4-byte UTF-8) contribute a surrogate pair (+2).
126
+ std::vector<uint32_t> buildUtf16PrefixMap(const std::string &code) {
127
+ const size_t n = code.size();
128
+ std::vector<uint32_t> prefix(n + 1, 0);
129
+ uint32_t units = 0;
130
+ size_t i = 0;
131
+ while (i < n) {
132
+ unsigned char c = static_cast<unsigned char>(code[i]);
133
+ size_t len;
134
+ uint32_t width;
135
+ if (c < 0x80) {
136
+ len = 1;
137
+ width = 1;
138
+ } else if ((c >> 5) == 0x6) {
139
+ len = 2;
140
+ width = 1;
141
+ } else if ((c >> 4) == 0xE) {
142
+ len = 3;
143
+ width = 1;
144
+ } else if ((c >> 3) == 0x1E) {
145
+ len = 4;
146
+ width = 2;
147
+ } else {
148
+ len = 1;
149
+ width = 1;
150
+ }
151
+ units += width;
152
+ for (size_t k = 1; k <= len && i + k <= n; ++k) {
153
+ prefix[i + k] = units;
154
+ }
155
+ i += len;
156
+ }
157
+ return prefix;
158
+ }
159
+
160
+ using ParserPtr = std::unique_ptr<TSParser, decltype(&ts_parser_delete)>;
161
+ using TreePtr = std::unique_ptr<TSTree, decltype(&ts_tree_delete)>;
162
+ using CursorPtr = std::unique_ptr<TSQueryCursor, decltype(&ts_query_cursor_delete)>;
163
+
164
+ } // namespace
165
+
166
+ // Resolves the language to a compiled grammar, parses the code, runs the
167
+ // grammar's highlight query, resolves overlapping captures (innermost span
168
+ // wins per byte), and returns coalesced foreground-only tokens with UTF-16
169
+ // offsets. Any failure along the way degrades to an empty vector (plain
170
+ // rendering).
171
+ std::vector<HighlightToken> highlightCode(const std::string &code, const std::string &language) {
172
+ try {
173
+ if (code.empty()) {
174
+ return {};
175
+ }
176
+
177
+ std::string grammarId = canonicalGrammarId(language);
178
+ if (grammarId.empty()) {
179
+ return {};
180
+ }
181
+ const GrammarEntry *grammar = findGrammar(grammarId.c_str());
182
+ if (grammar == nullptr) {
183
+ return {};
184
+ }
185
+
186
+ if (code.size() > kMaxBytes) {
187
+ return {};
188
+ }
189
+ size_t lines = 1;
190
+ for (char c : code) {
191
+ if (c == '\n' && ++lines > kMaxLines) {
192
+ return {};
193
+ }
194
+ }
195
+
196
+ ParserPtr parser(ts_parser_new(), ts_parser_delete);
197
+ if (!parser) {
198
+ return {};
199
+ }
200
+ const TSLanguage *tsLanguage = grammar->language();
201
+ if (tsLanguage == nullptr || !ts_parser_set_language(parser.get(), tsLanguage)) {
202
+ return {};
203
+ }
204
+
205
+ TSQuery *query = queryForLanguage(tsLanguage, grammar->highlightsQuery);
206
+ if (query == nullptr) {
207
+ return {};
208
+ }
209
+
210
+ TreePtr tree(ts_parser_parse_string(parser.get(), nullptr, code.c_str(), static_cast<uint32_t>(code.size())),
211
+ ts_tree_delete);
212
+ if (!tree) {
213
+ return {};
214
+ }
215
+
216
+ CursorPtr cursor(ts_query_cursor_new(), ts_query_cursor_delete);
217
+ if (!cursor) {
218
+ return {};
219
+ }
220
+ ts_query_cursor_exec(cursor.get(), query, ts_tree_root_node(tree.get()));
221
+
222
+ // Innermost-wins overlap resolution: paint each capture's byte range,
223
+ // widest span first, so tighter captures overwrite. A -1 byte is uncolored.
224
+ struct Capture {
225
+ uint32_t start;
226
+ uint32_t end;
227
+ HighlightTokenType type;
228
+ };
229
+ std::vector<Capture> captures;
230
+ TSQueryMatch match;
231
+ uint32_t captureIndex = 0;
232
+ while (ts_query_cursor_next_capture(cursor.get(), &match, &captureIndex)) {
233
+ const TSQueryCapture &capture = match.captures[captureIndex];
234
+ uint32_t nameLength = 0;
235
+ const char *name = ts_query_capture_name_for_id(query, capture.index, &nameLength);
236
+ HighlightTokenType type;
237
+ if (name == nullptr || !mapCaptureName(name, nameLength, type)) {
238
+ continue;
239
+ }
240
+ uint32_t start = ts_node_start_byte(capture.node);
241
+ uint32_t end = ts_node_end_byte(capture.node);
242
+ if (end > start && end <= code.size()) {
243
+ captures.push_back({start, end, type});
244
+ }
245
+ }
246
+ if (captures.empty()) {
247
+ return {};
248
+ }
249
+
250
+ std::stable_sort(captures.begin(), captures.end(),
251
+ [](const Capture &a, const Capture &b) { return (a.end - a.start) > (b.end - b.start); });
252
+
253
+ std::vector<int8_t> byteType(code.size(), -1);
254
+ for (const Capture &capture : captures) {
255
+ for (uint32_t b = capture.start; b < capture.end; ++b) {
256
+ byteType[b] = static_cast<int8_t>(capture.type);
257
+ }
258
+ }
259
+
260
+ std::vector<uint32_t> u16 = buildUtf16PrefixMap(code);
261
+ std::vector<HighlightToken> tokens;
262
+ size_t b = 0;
263
+ const size_t n = code.size();
264
+ while (b < n) {
265
+ if (byteType[b] < 0) {
266
+ ++b;
267
+ continue;
268
+ }
269
+ int8_t type = byteType[b];
270
+ size_t runStart = b;
271
+ while (b < n && byteType[b] == type) {
272
+ ++b;
273
+ }
274
+ tokens.push_back({u16[runStart], u16[b], static_cast<HighlightTokenType>(type)});
275
+ }
276
+ return tokens;
277
+ } catch (...) {
278
+ return {};
279
+ }
280
+ }
281
+
282
+ } // namespace Markdown
283
+
284
+ #endif
@@ -0,0 +1,66 @@
1
+ #pragma once
2
+
3
+ #include <cstdint>
4
+ #include <string>
5
+ #include <vector>
6
+
7
+ // Shared seam for optional syntax highlighting of fenced code blocks.
8
+ //
9
+ // The real implementation is compiled only when ENRICHED_MARKDOWN_CODE_HIGHLIGHT
10
+ // is defined by the build. Without the flag the stub in CodeBlockHighlighter.cpp
11
+ // returns no tokens and platform callers keep the plain uncolored rendering, so
12
+ // the absent module degrades to the default code block appearance. The same
13
+ // fallback applies at runtime when a language has no compiled grammar or
14
+ // highlighting fails.
15
+ //
16
+ // The seam returns semantic tokens instead of a platform text type on
17
+ // purpose. Platform adapters map token types to foreground colors and apply
18
+ // them to their attributed string. Since foreground color never affects text
19
+ // metrics, the block height measured from the plain string is guaranteed to
20
+ // match the drawn height regardless of what an implementation returns.
21
+ //
22
+ // Token offsets are UTF-16 code units into the code string, because both
23
+ // Android (Spannable) and iOS (NSAttributedString) address text in UTF-16.
24
+ // Implementations are responsible for converting tree-sitter byte offsets.
25
+ //
26
+ // Token types follow tree-sitter's standard highlight capture names,
27
+ // flattened to one level. Values are explicit because they cross the JNI
28
+ // boundary as plain integers.
29
+ //
30
+ // Both markdown flavors call this seam: the github flavor highlights the code
31
+ // string in its container view, and the commonmark renderers
32
+ // (CodeBlockRenderer.kt / CodeBlockRenderer.m) apply the tokens to their
33
+ // content range through the platform adapters.
34
+
35
+ namespace Markdown {
36
+
37
+ enum class HighlightTokenType : uint8_t {
38
+ Keyword = 0,
39
+ Operator = 1,
40
+ Punctuation = 2,
41
+ String = 3,
42
+ Number = 4,
43
+ Constant = 5,
44
+ Comment = 6,
45
+ Function = 7,
46
+ Type = 8,
47
+ Variable = 9,
48
+ Property = 10,
49
+ Tag = 11,
50
+ Attribute = 12,
51
+ Embedded = 13,
52
+ };
53
+
54
+ struct HighlightToken {
55
+ uint32_t start;
56
+ uint32_t end;
57
+ HighlightTokenType type;
58
+ };
59
+
60
+ // code is the UTF-8 code block content without the fence lines; language is
61
+ // the fence info string (for example "python"), empty when absent. Returns an
62
+ // empty vector whenever highlighting is unavailable (module compiled out,
63
+ // unknown language, parse failure).
64
+ std::vector<HighlightToken> highlightCode(const std::string& code, const std::string& language);
65
+
66
+ } // namespace Markdown
@@ -0,0 +1,138 @@
1
+ #include "CodeBlockLanguages.hpp"
2
+
3
+ #include <algorithm>
4
+ #include <array>
5
+ #include <cctype>
6
+ #include <cstring>
7
+
8
+ namespace Markdown {
9
+
10
+ namespace {
11
+
12
+ struct LanguageName {
13
+ const char *key;
14
+ const char *name;
15
+ // Canonical tree-sitter grammar id (vendored directory name), or "" when no
16
+ // grammar covers this fence language.
17
+ const char *grammar;
18
+ };
19
+
20
+ // Sorted by key; both lookups below binary-search this table.
21
+ constexpr std::array<LanguageName, 42> kLanguageNames{{
22
+ {"bash", "Bash", "bash"},
23
+ {"c", "C", "c"},
24
+ {"cc", "C++", "cpp"},
25
+ {"cpp", "C++", "cpp"},
26
+ {"cs", "C#", "c-sharp"},
27
+ {"csharp", "C#", "c-sharp"},
28
+ {"css", "CSS", "css"},
29
+ {"cxx", "C++", "cpp"},
30
+ {"dockerfile", "Dockerfile", ""},
31
+ {"go", "Go", "go"},
32
+ {"golang", "Go", "go"},
33
+ {"graphql", "GraphQL", ""},
34
+ {"html", "HTML", "html"},
35
+ {"java", "Java", "java"},
36
+ {"javascript", "JavaScript", "javascript"},
37
+ {"js", "JavaScript", "javascript"},
38
+ {"json", "JSON", "json"},
39
+ {"jsx", "JSX", "javascript"},
40
+ {"markdown", "Markdown", "markdown"},
41
+ {"md", "Markdown", "markdown"},
42
+ {"objc", "Objective-C", ""},
43
+ {"objectivec", "Objective-C", ""},
44
+ {"php", "PHP", "php"},
45
+ {"py", "Python", "python"},
46
+ {"python", "Python", "python"},
47
+ {"rb", "Ruby", "ruby"},
48
+ {"rs", "Rust", "rust"},
49
+ {"ruby", "Ruby", "ruby"},
50
+ {"rust", "Rust", "rust"},
51
+ {"scss", "SCSS", ""},
52
+ {"sh", "Shell", "bash"},
53
+ {"shell", "Shell", "bash"},
54
+ {"sql", "SQL", ""},
55
+ {"swift", "Swift", "swift"},
56
+ {"toml", "TOML", ""},
57
+ {"ts", "TypeScript", "typescript"},
58
+ {"tsx", "TSX", "tsx"},
59
+ {"typescript", "TypeScript", "typescript"},
60
+ {"xml", "XML", ""},
61
+ {"yaml", "YAML", "yaml"},
62
+ {"yml", "YAML", "yaml"},
63
+ {"zsh", "Zsh", "bash"},
64
+ }};
65
+
66
+ // findLanguage binary-searches kLanguageNames, so the table must be strictly
67
+ // ascending by key under C strcmp order. Enforce it at compile time: a
68
+ // misordered entry (e.g. "ruby" before "rs") would otherwise silently fail the
69
+ // lookup and leave that language unhighlighted.
70
+ constexpr bool keyLess(const char *a, const char *b) {
71
+ for (std::size_t i = 0;; ++i) {
72
+ unsigned char ca = static_cast<unsigned char>(a[i]);
73
+ unsigned char cb = static_cast<unsigned char>(b[i]);
74
+ if (ca != cb) {
75
+ return ca < cb;
76
+ }
77
+ if (ca == '\0') {
78
+ return false;
79
+ }
80
+ }
81
+ }
82
+
83
+ constexpr bool languageTableIsSorted() {
84
+ for (std::size_t i = 1; i < kLanguageNames.size(); ++i) {
85
+ if (!keyLess(kLanguageNames[i - 1].key, kLanguageNames[i].key)) {
86
+ return false;
87
+ }
88
+ }
89
+ return true;
90
+ }
91
+
92
+ static_assert(languageTableIsSorted(), "kLanguageNames must be sorted by key for binary search");
93
+
94
+ // Lowercases language and binary-searches the table. Returns nullptr on miss.
95
+ const LanguageName *findLanguage(const std::string &language, std::string &lowerOut) {
96
+ lowerOut = language;
97
+ for (char &c : lowerOut) {
98
+ c = static_cast<char>(std::tolower(static_cast<unsigned char>(c)));
99
+ }
100
+
101
+ auto it =
102
+ std::lower_bound(kLanguageNames.begin(), kLanguageNames.end(), lowerOut.c_str(),
103
+ [](const LanguageName &entry, const char *key) { return std::strcmp(entry.key, key) < 0; });
104
+ if (it != kLanguageNames.end() && lowerOut == it->key) {
105
+ return &(*it);
106
+ }
107
+ return nullptr;
108
+ }
109
+
110
+ } // namespace
111
+
112
+ std::string displayNameForLanguage(const std::string &language) {
113
+ if (language.empty()) {
114
+ return "";
115
+ }
116
+
117
+ std::string lower;
118
+ if (const LanguageName *entry = findLanguage(language, lower)) {
119
+ return entry->name;
120
+ }
121
+
122
+ lower[0] = static_cast<char>(std::toupper(static_cast<unsigned char>(lower[0])));
123
+ return lower;
124
+ }
125
+
126
+ std::string canonicalGrammarId(const std::string &language) {
127
+ if (language.empty()) {
128
+ return "";
129
+ }
130
+
131
+ std::string lower;
132
+ if (const LanguageName *entry = findLanguage(language, lower)) {
133
+ return entry->grammar;
134
+ }
135
+ return "";
136
+ }
137
+
138
+ } // namespace Markdown
@@ -0,0 +1,25 @@
1
+ #pragma once
2
+
3
+ #include <string>
4
+
5
+ // Display names for code block fence languages, shared by every platform and
6
+ // both markdown flavors so a fence like ```python is labeled identically
7
+ // everywhere. Unlike the highlighting seam this is always compiled; it does
8
+ // not depend on ENRICHED_MARKDOWN_CODE_HIGHLIGHT.
9
+
10
+ namespace Markdown {
11
+
12
+ // Maps a fence info string (for example "python", "js") to a human readable
13
+ // display name ("Python", "JavaScript"). Unknown languages fall back to the
14
+ // lowercased input with the first ASCII letter capitalized. Empty input
15
+ // returns an empty string.
16
+ std::string displayNameForLanguage(const std::string& language);
17
+
18
+ // Maps a fence info string to the canonical tree-sitter grammar id that can
19
+ // highlight it (for example "js" and "jsx" both map to "javascript"), or an
20
+ // empty string when no grammar covers the language. The id is the vendored
21
+ // grammar directory name; whether that grammar is actually compiled into the
22
+ // build is answered separately by findGrammar.
23
+ std::string canonicalGrammarId(const std::string& language);
24
+
25
+ } // namespace Markdown
@@ -0,0 +1,28 @@
1
+ #pragma once
2
+
3
+ // Registry of the tree-sitter grammars compiled into this build. The table and
4
+ // the findGrammar definition live in generated_registry.cpp, emitted by
5
+ // vendor/gen-registry.mjs for exactly the selected language subset, so this
6
+ // header never references symbols for grammars that were not compiled.
7
+ //
8
+ // Only meaningful when ENRICHED_MARKDOWN_CODE_HIGHLIGHT is defined; without the
9
+ // flag neither this header nor generated_registry.cpp is compiled.
10
+
11
+ struct TSLanguage;
12
+
13
+ namespace Markdown {
14
+
15
+ struct GrammarEntry {
16
+ // Canonical grammar id, matching canonicalGrammarId() in CodeBlockLanguages.
17
+ const char *canonicalId;
18
+ // tree-sitter language constructor (extern "C" tree_sitter_<id>).
19
+ const TSLanguage *(*language)(void);
20
+ // The grammar's highlights.scm, inheritance already inlined, as a C string.
21
+ const char *highlightsQuery;
22
+ };
23
+
24
+ // Returns the entry for canonicalId, or nullptr when no grammar for it was
25
+ // compiled into this build (unselected language) or canonicalId is empty.
26
+ const GrammarEntry *findGrammar(const char *canonicalId);
27
+
28
+ } // namespace Markdown