react-native-enriched-markdown 0.1.0 → 0.2.0

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 (226) hide show
  1. package/LICENSE +20 -0
  2. package/README.md +551 -0
  3. package/ReactNativeEnrichedMarkdown.podspec +27 -0
  4. package/android/build.gradle +101 -0
  5. package/android/generated/java/com/facebook/react/viewmanagers/EnrichedMarkdownTextManagerDelegate.java +54 -0
  6. package/android/generated/java/com/facebook/react/viewmanagers/EnrichedMarkdownTextManagerInterface.java +26 -0
  7. package/android/generated/jni/react/renderer/components/EnrichedMarkdownTextSpec/ComponentDescriptors.cpp +22 -0
  8. package/android/generated/jni/react/renderer/components/EnrichedMarkdownTextSpec/ComponentDescriptors.h +24 -0
  9. package/android/generated/jni/react/renderer/components/EnrichedMarkdownTextSpec/EventEmitters.cpp +33 -0
  10. package/android/generated/jni/react/renderer/components/EnrichedMarkdownTextSpec/EventEmitters.h +31 -0
  11. package/android/generated/jni/react/renderer/components/EnrichedMarkdownTextSpec/Props.cpp +82 -0
  12. package/android/generated/jni/react/renderer/components/EnrichedMarkdownTextSpec/Props.h +1388 -0
  13. package/android/generated/jni/react/renderer/components/EnrichedMarkdownTextSpec/ShadowNodes.cpp +17 -0
  14. package/android/generated/jni/react/renderer/components/EnrichedMarkdownTextSpec/ShadowNodes.h +32 -0
  15. package/android/generated/jni/react/renderer/components/EnrichedMarkdownTextSpec/States.cpp +16 -0
  16. package/android/generated/jni/react/renderer/components/EnrichedMarkdownTextSpec/States.h +20 -0
  17. package/android/gradle.properties +5 -0
  18. package/android/src/main/AndroidManifest.xml +2 -0
  19. package/android/src/main/baseline-prof.txt +65 -0
  20. package/android/src/main/cpp/jni-adapter.cpp +220 -0
  21. package/android/src/main/java/com/swmansion/enriched/markdown/EnrichedMarkdownText.kt +270 -0
  22. package/android/src/main/java/com/swmansion/enriched/markdown/EnrichedMarkdownTextLayoutManager.kt +15 -0
  23. package/android/src/main/java/com/swmansion/enriched/markdown/EnrichedMarkdownTextManager.kt +173 -0
  24. package/android/src/main/java/com/swmansion/enriched/markdown/EnrichedMarkdownTextPackage.kt +17 -0
  25. package/android/src/main/java/com/swmansion/enriched/markdown/MeasurementStore.kt +385 -0
  26. package/android/src/main/java/com/swmansion/enriched/markdown/accessibility/MarkdownAccessibilityHelper.kt +279 -0
  27. package/android/src/main/java/com/swmansion/enriched/markdown/events/LinkLongPressEvent.kt +23 -0
  28. package/android/src/main/java/com/swmansion/enriched/markdown/events/LinkPressEvent.kt +23 -0
  29. package/android/src/main/java/com/swmansion/enriched/markdown/parser/MarkdownASTNode.kt +31 -0
  30. package/android/src/main/java/com/swmansion/enriched/markdown/parser/Parser.kt +62 -0
  31. package/android/src/main/java/com/swmansion/enriched/markdown/renderer/BlockStyleContext.kt +166 -0
  32. package/android/src/main/java/com/swmansion/enriched/markdown/renderer/BlockquoteRenderer.kt +84 -0
  33. package/android/src/main/java/com/swmansion/enriched/markdown/renderer/CodeBlockRenderer.kt +104 -0
  34. package/android/src/main/java/com/swmansion/enriched/markdown/renderer/CodeRenderer.kt +36 -0
  35. package/android/src/main/java/com/swmansion/enriched/markdown/renderer/DocumentRenderer.kt +16 -0
  36. package/android/src/main/java/com/swmansion/enriched/markdown/renderer/EmphasisRenderer.kt +27 -0
  37. package/android/src/main/java/com/swmansion/enriched/markdown/renderer/HeadingRenderer.kt +70 -0
  38. package/android/src/main/java/com/swmansion/enriched/markdown/renderer/ImageRenderer.kt +68 -0
  39. package/android/src/main/java/com/swmansion/enriched/markdown/renderer/LineBreakRenderer.kt +16 -0
  40. package/android/src/main/java/com/swmansion/enriched/markdown/renderer/LinkRenderer.kt +29 -0
  41. package/android/src/main/java/com/swmansion/enriched/markdown/renderer/ListContextManager.kt +105 -0
  42. package/android/src/main/java/com/swmansion/enriched/markdown/renderer/ListItemRenderer.kt +59 -0
  43. package/android/src/main/java/com/swmansion/enriched/markdown/renderer/ListRenderer.kt +76 -0
  44. package/android/src/main/java/com/swmansion/enriched/markdown/renderer/NodeRenderer.kt +103 -0
  45. package/android/src/main/java/com/swmansion/enriched/markdown/renderer/ParagraphRenderer.kt +80 -0
  46. package/android/src/main/java/com/swmansion/enriched/markdown/renderer/Renderer.kt +109 -0
  47. package/android/src/main/java/com/swmansion/enriched/markdown/renderer/SpanStyleCache.kt +86 -0
  48. package/android/src/main/java/com/swmansion/enriched/markdown/renderer/StrikethroughRenderer.kt +27 -0
  49. package/android/src/main/java/com/swmansion/enriched/markdown/renderer/StrongRenderer.kt +27 -0
  50. package/android/src/main/java/com/swmansion/enriched/markdown/renderer/TextRenderer.kt +30 -0
  51. package/android/src/main/java/com/swmansion/enriched/markdown/renderer/ThematicBreakRenderer.kt +45 -0
  52. package/android/src/main/java/com/swmansion/enriched/markdown/renderer/UnderlineRenderer.kt +27 -0
  53. package/android/src/main/java/com/swmansion/enriched/markdown/spans/BaseListSpan.kt +136 -0
  54. package/android/src/main/java/com/swmansion/enriched/markdown/spans/BlockquoteSpan.kt +135 -0
  55. package/android/src/main/java/com/swmansion/enriched/markdown/spans/CodeBackgroundSpan.kt +180 -0
  56. package/android/src/main/java/com/swmansion/enriched/markdown/spans/CodeBlockSpan.kt +196 -0
  57. package/android/src/main/java/com/swmansion/enriched/markdown/spans/CodeSpan.kt +27 -0
  58. package/android/src/main/java/com/swmansion/enriched/markdown/spans/EmphasisSpan.kt +34 -0
  59. package/android/src/main/java/com/swmansion/enriched/markdown/spans/HeadingSpan.kt +38 -0
  60. package/android/src/main/java/com/swmansion/enriched/markdown/spans/ImageSpan.kt +321 -0
  61. package/android/src/main/java/com/swmansion/enriched/markdown/spans/LineHeightSpan.kt +27 -0
  62. package/android/src/main/java/com/swmansion/enriched/markdown/spans/LinkSpan.kt +51 -0
  63. package/android/src/main/java/com/swmansion/enriched/markdown/spans/MarginBottomSpan.kt +76 -0
  64. package/android/src/main/java/com/swmansion/enriched/markdown/spans/OrderedListSpan.kt +87 -0
  65. package/android/src/main/java/com/swmansion/enriched/markdown/spans/StrikethroughSpan.kt +12 -0
  66. package/android/src/main/java/com/swmansion/enriched/markdown/spans/StrongSpan.kt +37 -0
  67. package/android/src/main/java/com/swmansion/enriched/markdown/spans/TextSpan.kt +26 -0
  68. package/android/src/main/java/com/swmansion/enriched/markdown/spans/ThematicBreakSpan.kt +69 -0
  69. package/android/src/main/java/com/swmansion/enriched/markdown/spans/UnorderedListSpan.kt +69 -0
  70. package/android/src/main/java/com/swmansion/enriched/markdown/styles/BaseBlockStyle.kt +11 -0
  71. package/android/src/main/java/com/swmansion/enriched/markdown/styles/BlockquoteStyle.kt +51 -0
  72. package/android/src/main/java/com/swmansion/enriched/markdown/styles/CodeBlockStyle.kt +54 -0
  73. package/android/src/main/java/com/swmansion/enriched/markdown/styles/CodeStyle.kt +21 -0
  74. package/android/src/main/java/com/swmansion/enriched/markdown/styles/EmphasisStyle.kt +17 -0
  75. package/android/src/main/java/com/swmansion/enriched/markdown/styles/HeadingStyle.kt +33 -0
  76. package/android/src/main/java/com/swmansion/enriched/markdown/styles/ImageStyle.kt +23 -0
  77. package/android/src/main/java/com/swmansion/enriched/markdown/styles/InlineImageStyle.kt +17 -0
  78. package/android/src/main/java/com/swmansion/enriched/markdown/styles/LinkStyle.kt +19 -0
  79. package/android/src/main/java/com/swmansion/enriched/markdown/styles/ListStyle.kt +57 -0
  80. package/android/src/main/java/com/swmansion/enriched/markdown/styles/ParagraphStyle.kt +33 -0
  81. package/android/src/main/java/com/swmansion/enriched/markdown/styles/StrikethroughStyle.kt +17 -0
  82. package/android/src/main/java/com/swmansion/enriched/markdown/styles/StrongStyle.kt +17 -0
  83. package/android/src/main/java/com/swmansion/enriched/markdown/styles/StyleConfig.kt +211 -0
  84. package/android/src/main/java/com/swmansion/enriched/markdown/styles/StyleParser.kt +92 -0
  85. package/android/src/main/java/com/swmansion/enriched/markdown/styles/TextAlignment.kt +32 -0
  86. package/android/src/main/java/com/swmansion/enriched/markdown/styles/ThematicBreakStyle.kt +23 -0
  87. package/android/src/main/java/com/swmansion/enriched/markdown/styles/UnderlineStyle.kt +17 -0
  88. package/android/src/main/java/com/swmansion/enriched/markdown/utils/AsyncDrawable.kt +91 -0
  89. package/android/src/main/java/com/swmansion/enriched/markdown/utils/HTMLGenerator.kt +827 -0
  90. package/android/src/main/java/com/swmansion/enriched/markdown/utils/LinkLongPressMovementMethod.kt +121 -0
  91. package/android/src/main/java/com/swmansion/enriched/markdown/utils/MarkdownExtractor.kt +375 -0
  92. package/android/src/main/java/com/swmansion/enriched/markdown/utils/SelectionActionMode.kt +139 -0
  93. package/android/src/main/java/com/swmansion/enriched/markdown/utils/Utils.kt +183 -0
  94. package/android/src/main/jni/CMakeLists.txt +70 -0
  95. package/android/src/main/jni/EnrichedMarkdownTextSpec.cpp +21 -0
  96. package/android/src/main/jni/EnrichedMarkdownTextSpec.h +25 -0
  97. package/android/src/main/jni/react/renderer/components/EnrichedMarkdownTextSpec/MarkdownTextComponentDescriptor.h +29 -0
  98. package/android/src/main/jni/react/renderer/components/EnrichedMarkdownTextSpec/MarkdownTextMeasurementManager.cpp +45 -0
  99. package/android/src/main/jni/react/renderer/components/EnrichedMarkdownTextSpec/MarkdownTextMeasurementManager.h +21 -0
  100. package/android/src/main/jni/react/renderer/components/EnrichedMarkdownTextSpec/MarkdownTextShadowNode.cpp +20 -0
  101. package/android/src/main/jni/react/renderer/components/EnrichedMarkdownTextSpec/MarkdownTextShadowNode.h +37 -0
  102. package/android/src/main/jni/react/renderer/components/EnrichedMarkdownTextSpec/conversions.h +22 -0
  103. package/cpp/md4c/md4c.c +6492 -0
  104. package/cpp/md4c/md4c.h +402 -0
  105. package/cpp/parser/MD4CParser.cpp +327 -0
  106. package/cpp/parser/MD4CParser.hpp +27 -0
  107. package/cpp/parser/MarkdownASTNode.hpp +51 -0
  108. package/ios/EnrichedMarkdownText.h +18 -0
  109. package/ios/EnrichedMarkdownText.mm +1401 -0
  110. package/ios/attachments/EnrichedMarkdownImageAttachment.h +23 -0
  111. package/ios/attachments/EnrichedMarkdownImageAttachment.m +185 -0
  112. package/ios/attachments/ThematicBreakAttachment.h +15 -0
  113. package/ios/attachments/ThematicBreakAttachment.m +33 -0
  114. package/ios/generated/EnrichedMarkdownTextSpec/ComponentDescriptors.cpp +22 -0
  115. package/ios/generated/EnrichedMarkdownTextSpec/ComponentDescriptors.h +24 -0
  116. package/ios/generated/EnrichedMarkdownTextSpec/EventEmitters.cpp +33 -0
  117. package/ios/generated/EnrichedMarkdownTextSpec/EventEmitters.h +31 -0
  118. package/ios/generated/EnrichedMarkdownTextSpec/Props.cpp +82 -0
  119. package/ios/generated/EnrichedMarkdownTextSpec/Props.h +1388 -0
  120. package/ios/generated/EnrichedMarkdownTextSpec/RCTComponentViewHelpers.h +20 -0
  121. package/ios/generated/EnrichedMarkdownTextSpec/ShadowNodes.cpp +17 -0
  122. package/ios/generated/EnrichedMarkdownTextSpec/ShadowNodes.h +32 -0
  123. package/ios/generated/EnrichedMarkdownTextSpec/States.cpp +16 -0
  124. package/ios/generated/EnrichedMarkdownTextSpec/States.h +20 -0
  125. package/ios/internals/EnrichedMarkdownTextComponentDescriptor.h +19 -0
  126. package/ios/internals/EnrichedMarkdownTextShadowNode.h +43 -0
  127. package/ios/internals/EnrichedMarkdownTextShadowNode.mm +85 -0
  128. package/ios/internals/EnrichedMarkdownTextState.h +24 -0
  129. package/ios/parser/MarkdownASTNode.h +35 -0
  130. package/ios/parser/MarkdownASTNode.m +32 -0
  131. package/ios/parser/MarkdownParser.h +17 -0
  132. package/ios/parser/MarkdownParser.mm +42 -0
  133. package/ios/parser/MarkdownParserBridge.mm +120 -0
  134. package/ios/renderer/AttributedRenderer.h +11 -0
  135. package/ios/renderer/AttributedRenderer.m +152 -0
  136. package/ios/renderer/BlockquoteRenderer.h +7 -0
  137. package/ios/renderer/BlockquoteRenderer.m +160 -0
  138. package/ios/renderer/CodeBlockRenderer.h +10 -0
  139. package/ios/renderer/CodeBlockRenderer.m +90 -0
  140. package/ios/renderer/CodeRenderer.h +10 -0
  141. package/ios/renderer/CodeRenderer.m +60 -0
  142. package/ios/renderer/EmphasisRenderer.h +6 -0
  143. package/ios/renderer/EmphasisRenderer.m +96 -0
  144. package/ios/renderer/HeadingRenderer.h +7 -0
  145. package/ios/renderer/HeadingRenderer.m +105 -0
  146. package/ios/renderer/ImageRenderer.h +12 -0
  147. package/ios/renderer/ImageRenderer.m +83 -0
  148. package/ios/renderer/LinkRenderer.h +7 -0
  149. package/ios/renderer/LinkRenderer.m +69 -0
  150. package/ios/renderer/ListItemRenderer.h +16 -0
  151. package/ios/renderer/ListItemRenderer.m +103 -0
  152. package/ios/renderer/ListRenderer.h +13 -0
  153. package/ios/renderer/ListRenderer.m +70 -0
  154. package/ios/renderer/NodeRenderer.h +8 -0
  155. package/ios/renderer/ParagraphRenderer.h +7 -0
  156. package/ios/renderer/ParagraphRenderer.m +80 -0
  157. package/ios/renderer/RenderContext.h +105 -0
  158. package/ios/renderer/RenderContext.m +312 -0
  159. package/ios/renderer/RendererFactory.h +12 -0
  160. package/ios/renderer/RendererFactory.m +116 -0
  161. package/ios/renderer/StrikethroughRenderer.h +6 -0
  162. package/ios/renderer/StrikethroughRenderer.m +40 -0
  163. package/ios/renderer/StrongRenderer.h +6 -0
  164. package/ios/renderer/StrongRenderer.m +83 -0
  165. package/ios/renderer/TextRenderer.h +6 -0
  166. package/ios/renderer/TextRenderer.m +16 -0
  167. package/ios/renderer/ThematicBreakRenderer.h +5 -0
  168. package/ios/renderer/ThematicBreakRenderer.m +53 -0
  169. package/ios/renderer/UnderlineRenderer.h +6 -0
  170. package/ios/renderer/UnderlineRenderer.m +39 -0
  171. package/ios/styles/StyleConfig.h +274 -0
  172. package/ios/styles/StyleConfig.mm +1806 -0
  173. package/ios/utils/AccessibilityInfo.h +35 -0
  174. package/ios/utils/AccessibilityInfo.m +24 -0
  175. package/ios/utils/BlockquoteBorder.h +20 -0
  176. package/ios/utils/BlockquoteBorder.m +92 -0
  177. package/ios/utils/CodeBackground.h +19 -0
  178. package/ios/utils/CodeBackground.m +191 -0
  179. package/ios/utils/CodeBlockBackground.h +17 -0
  180. package/ios/utils/CodeBlockBackground.m +82 -0
  181. package/ios/utils/EditMenuUtils.h +22 -0
  182. package/ios/utils/EditMenuUtils.m +118 -0
  183. package/ios/utils/FontUtils.h +25 -0
  184. package/ios/utils/FontUtils.m +27 -0
  185. package/ios/utils/HTMLGenerator.h +20 -0
  186. package/ios/utils/HTMLGenerator.m +793 -0
  187. package/ios/utils/LastElementUtils.h +53 -0
  188. package/ios/utils/ListMarkerDrawer.h +15 -0
  189. package/ios/utils/ListMarkerDrawer.m +127 -0
  190. package/ios/utils/MarkdownAccessibilityElementBuilder.h +45 -0
  191. package/ios/utils/MarkdownAccessibilityElementBuilder.m +323 -0
  192. package/ios/utils/MarkdownExtractor.h +17 -0
  193. package/ios/utils/MarkdownExtractor.m +308 -0
  194. package/ios/utils/ParagraphStyleUtils.h +21 -0
  195. package/ios/utils/ParagraphStyleUtils.m +111 -0
  196. package/ios/utils/PasteboardUtils.h +36 -0
  197. package/ios/utils/PasteboardUtils.m +134 -0
  198. package/ios/utils/RTFExportUtils.h +24 -0
  199. package/ios/utils/RTFExportUtils.m +297 -0
  200. package/ios/utils/RuntimeKeys.h +38 -0
  201. package/ios/utils/RuntimeKeys.m +11 -0
  202. package/ios/utils/TextViewLayoutManager.h +14 -0
  203. package/ios/utils/TextViewLayoutManager.mm +113 -0
  204. package/lib/module/EnrichedMarkdownText.js +65 -0
  205. package/lib/module/EnrichedMarkdownText.js.map +1 -0
  206. package/lib/module/EnrichedMarkdownTextNativeComponent.ts +210 -0
  207. package/lib/module/index.js +4 -0
  208. package/lib/module/index.js.map +1 -0
  209. package/lib/module/normalizeMarkdownStyle.js +384 -0
  210. package/lib/module/normalizeMarkdownStyle.js.map +1 -0
  211. package/lib/module/package.json +1 -0
  212. package/lib/typescript/package.json +1 -0
  213. package/lib/typescript/src/EnrichedMarkdownText.d.ts +183 -0
  214. package/lib/typescript/src/EnrichedMarkdownText.d.ts.map +1 -0
  215. package/lib/typescript/src/EnrichedMarkdownTextNativeComponent.d.ts +185 -0
  216. package/lib/typescript/src/EnrichedMarkdownTextNativeComponent.d.ts.map +1 -0
  217. package/lib/typescript/src/index.d.ts +4 -0
  218. package/lib/typescript/src/index.d.ts.map +1 -0
  219. package/lib/typescript/src/normalizeMarkdownStyle.d.ts +6 -0
  220. package/lib/typescript/src/normalizeMarkdownStyle.d.ts.map +1 -0
  221. package/package.json +186 -1
  222. package/react-native.config.js +13 -0
  223. package/src/EnrichedMarkdownText.tsx +280 -0
  224. package/src/EnrichedMarkdownTextNativeComponent.ts +210 -0
  225. package/src/index.tsx +10 -0
  226. package/src/normalizeMarkdownStyle.ts +423 -0
@@ -0,0 +1,20 @@
1
+ /**
2
+ * This code was generated by [react-native-codegen](https://www.npmjs.com/package/react-native-codegen).
3
+ *
4
+ * Do not edit this file as changes may cause incorrect behavior and will be lost
5
+ * once the code is regenerated.
6
+ *
7
+ * @generated by codegen project: GenerateComponentHObjCpp.js
8
+ */
9
+
10
+ #import <Foundation/Foundation.h>
11
+ #import <React/RCTDefines.h>
12
+ #import <React/RCTLog.h>
13
+
14
+ NS_ASSUME_NONNULL_BEGIN
15
+
16
+ @protocol RCTEnrichedMarkdownTextViewProtocol <NSObject>
17
+
18
+ @end
19
+
20
+ NS_ASSUME_NONNULL_END
@@ -0,0 +1,17 @@
1
+
2
+ /**
3
+ * This code was generated by [react-native-codegen](https://www.npmjs.com/package/react-native-codegen).
4
+ *
5
+ * Do not edit this file as changes may cause incorrect behavior and will be lost
6
+ * once the code is regenerated.
7
+ *
8
+ * @generated by codegen project: GenerateShadowNodeCpp.js
9
+ */
10
+
11
+ #include "ShadowNodes.h"
12
+
13
+ namespace facebook::react {
14
+
15
+ extern const char EnrichedMarkdownTextComponentName[] = "EnrichedMarkdownText";
16
+
17
+ } // namespace facebook::react
@@ -0,0 +1,32 @@
1
+
2
+ /**
3
+ * This code was generated by [react-native-codegen](https://www.npmjs.com/package/react-native-codegen).
4
+ *
5
+ * Do not edit this file as changes may cause incorrect behavior and will be lost
6
+ * once the code is regenerated.
7
+ *
8
+ * @generated by codegen project: GenerateShadowNodeH.js
9
+ */
10
+
11
+ #pragma once
12
+
13
+ #include "EventEmitters.h"
14
+ #include "Props.h"
15
+ #include "States.h"
16
+ #include <react/renderer/components/view/ConcreteViewShadowNode.h>
17
+ #include <jsi/jsi.h>
18
+
19
+ namespace facebook::react {
20
+
21
+ JSI_EXPORT extern const char EnrichedMarkdownTextComponentName[];
22
+
23
+ /*
24
+ * `ShadowNode` for <EnrichedMarkdownText> component.
25
+ */
26
+ using EnrichedMarkdownTextShadowNode = ConcreteViewShadowNode<
27
+ EnrichedMarkdownTextComponentName,
28
+ EnrichedMarkdownTextProps,
29
+ EnrichedMarkdownTextEventEmitter,
30
+ EnrichedMarkdownTextState>;
31
+
32
+ } // namespace facebook::react
@@ -0,0 +1,16 @@
1
+
2
+ /**
3
+ * This code was generated by [react-native-codegen](https://www.npmjs.com/package/react-native-codegen).
4
+ *
5
+ * Do not edit this file as changes may cause incorrect behavior and will be lost
6
+ * once the code is regenerated.
7
+ *
8
+ * @generated by codegen project: GenerateStateCpp.js
9
+ */
10
+ #include "States.h"
11
+
12
+ namespace facebook::react {
13
+
14
+
15
+
16
+ } // namespace facebook::react
@@ -0,0 +1,20 @@
1
+ /**
2
+ * This code was generated by [react-native-codegen](https://www.npmjs.com/package/react-native-codegen).
3
+ *
4
+ * Do not edit this file as changes may cause incorrect behavior and will be lost
5
+ * once the code is regenerated.
6
+ *
7
+ * @generated by codegen project: GenerateStateH.js
8
+ */
9
+ #pragma once
10
+
11
+ #include <react/renderer/core/StateData.h>
12
+ #ifdef RN_SERIALIZABLE_STATE
13
+ #include <folly/dynamic.h>
14
+ #endif
15
+
16
+ namespace facebook::react {
17
+
18
+ using EnrichedMarkdownTextState = StateData;
19
+
20
+ } // namespace facebook::react
@@ -0,0 +1,19 @@
1
+ #pragma once
2
+ #include "EnrichedMarkdownTextShadowNode.h"
3
+ #include <react/debug/react_native_assert.h>
4
+ #include <react/renderer/core/ConcreteComponentDescriptor.h>
5
+
6
+ namespace facebook::react {
7
+
8
+ class EnrichedMarkdownTextComponentDescriptor final
9
+ : public ConcreteComponentDescriptor<EnrichedMarkdownTextShadowNode> {
10
+ public:
11
+ using ConcreteComponentDescriptor::ConcreteComponentDescriptor;
12
+
13
+ void adopt(ShadowNode &shadowNode) const override {
14
+ react_native_assert(dynamic_cast<EnrichedMarkdownTextShadowNode *>(&shadowNode));
15
+ ConcreteComponentDescriptor::adopt(shadowNode);
16
+ }
17
+ };
18
+
19
+ } // namespace facebook::react
@@ -0,0 +1,43 @@
1
+ #pragma once
2
+ #include <ReactNativeEnrichedMarkdown/EnrichedMarkdownTextState.h>
3
+ #include <ReactNativeEnrichedMarkdown/EventEmitters.h>
4
+ #include <ReactNativeEnrichedMarkdown/Props.h>
5
+ #include <react/renderer/components/view/ConcreteViewShadowNode.h>
6
+ #include <react/renderer/core/LayoutConstraints.h>
7
+
8
+ namespace facebook::react {
9
+
10
+ JSI_EXPORT extern const char EnrichedMarkdownTextComponentName[];
11
+
12
+ /// ShadowNode implementing measureContent for automatic height calculation.
13
+ class EnrichedMarkdownTextShadowNode
14
+ : public ConcreteViewShadowNode<EnrichedMarkdownTextComponentName, EnrichedMarkdownTextProps,
15
+ EnrichedMarkdownTextEventEmitter, EnrichedMarkdownTextState> {
16
+ public:
17
+ using ConcreteViewShadowNode::ConcreteViewShadowNode;
18
+
19
+ EnrichedMarkdownTextShadowNode(const ShadowNodeFragment &fragment, const ShadowNodeFamily::Shared &family,
20
+ ShadowNodeTraits traits);
21
+
22
+ EnrichedMarkdownTextShadowNode(const ShadowNode &sourceShadowNode, const ShadowNodeFragment &fragment);
23
+
24
+ void dirtyLayoutIfNeeded();
25
+
26
+ Size measureContent(const LayoutContext &layoutContext, const LayoutConstraints &layoutConstraints) const override;
27
+
28
+ static ShadowNodeTraits BaseTraits()
29
+ {
30
+ auto traits = ConcreteViewShadowNode::BaseTraits();
31
+ traits.set(ShadowNodeTraits::Trait::LeafYogaNode);
32
+ traits.set(ShadowNodeTraits::Trait::MeasurableYogaNode);
33
+ return traits;
34
+ }
35
+
36
+ private:
37
+ int localHeightRecalculationCounter_{0};
38
+
39
+ // Creates mock view off-screen for initial measurement when real view doesn't exist
40
+ id setupMockEnrichedMarkdownText_(CGFloat width) const;
41
+ };
42
+
43
+ } // namespace facebook::react
@@ -0,0 +1,85 @@
1
+ #import "EnrichedMarkdownTextShadowNode.h"
2
+ #import "EnrichedMarkdownText.h"
3
+ #import <react/utils/ManagedObjectWrapper.h>
4
+ #import <yoga/Yoga.h>
5
+
6
+ namespace facebook::react {
7
+
8
+ extern const char EnrichedMarkdownTextComponentName[] = "EnrichedMarkdownText";
9
+
10
+ EnrichedMarkdownTextShadowNode::EnrichedMarkdownTextShadowNode(const ShadowNodeFragment &fragment,
11
+ const ShadowNodeFamily::Shared &family,
12
+ ShadowNodeTraits traits)
13
+ : ConcreteViewShadowNode(fragment, family, traits)
14
+ {
15
+ }
16
+
17
+ EnrichedMarkdownTextShadowNode::EnrichedMarkdownTextShadowNode(const ShadowNode &sourceShadowNode,
18
+ const ShadowNodeFragment &fragment)
19
+ : ConcreteViewShadowNode(sourceShadowNode, fragment)
20
+ {
21
+ dirtyLayoutIfNeeded();
22
+ }
23
+
24
+ void EnrichedMarkdownTextShadowNode::dirtyLayoutIfNeeded()
25
+ {
26
+ const auto state = this->getStateData();
27
+ const int receivedCounter = state.getHeightRecalculationCounter();
28
+
29
+ if (receivedCounter > localHeightRecalculationCounter_) {
30
+ localHeightRecalculationCounter_ = receivedCounter;
31
+ YGNodeMarkDirty(&yogaNode_);
32
+ }
33
+ }
34
+
35
+ /// Creates a mock view off-screen to measure content when real view isn't ready yet.
36
+ id EnrichedMarkdownTextShadowNode::setupMockEnrichedMarkdownText_(CGFloat width) const
37
+ {
38
+ EnrichedMarkdownText *mockView = [[EnrichedMarkdownText alloc] initWithFrame:CGRectMake(20000, 20000, width, 1000)];
39
+
40
+ const auto props = this->getProps();
41
+ [mockView updateProps:props oldProps:nullptr];
42
+
43
+ // Render markdown synchronously for accurate measurement
44
+ const auto &typedProps = *std::static_pointer_cast<const EnrichedMarkdownTextProps>(props);
45
+ if (!typedProps.markdown.empty()) {
46
+ NSString *markdown = [NSString stringWithUTF8String:typedProps.markdown.c_str()];
47
+ [mockView renderMarkdownSynchronously:markdown];
48
+ }
49
+
50
+ return mockView;
51
+ }
52
+
53
+ Size EnrichedMarkdownTextShadowNode::measureContent(const LayoutContext &layoutContext,
54
+ const LayoutConstraints &layoutConstraints) const
55
+ {
56
+ CGFloat maxWidth = layoutConstraints.maximumSize.width;
57
+ CGFloat maxHeight = layoutConstraints.maximumSize.height;
58
+
59
+ RCTInternalGenericWeakWrapper *weakWrapper =
60
+ (RCTInternalGenericWeakWrapper *)unwrapManagedObject(getStateData().getComponentViewRef());
61
+ EnrichedMarkdownText *view = weakWrapper ? (EnrichedMarkdownText *)weakWrapper.object : nil;
62
+
63
+ __block CGSize size;
64
+
65
+ // Measure on main thread (required for UIKit)
66
+ void (^measureBlock)(void) = ^{
67
+ if (view) {
68
+ size = [view measureSize:maxWidth];
69
+ } else {
70
+ // No view yet - create mock view for accurate initial measurement
71
+ EnrichedMarkdownText *mockView = setupMockEnrichedMarkdownText_(maxWidth);
72
+ size = [mockView measureSize:maxWidth];
73
+ }
74
+ };
75
+
76
+ if ([NSThread isMainThread]) {
77
+ measureBlock();
78
+ } else {
79
+ dispatch_sync(dispatch_get_main_queue(), measureBlock);
80
+ }
81
+
82
+ return {size.width, MIN(size.height, maxHeight)};
83
+ }
84
+
85
+ } // namespace facebook::react
@@ -0,0 +1,24 @@
1
+ #pragma once
2
+ #include <memory>
3
+
4
+ namespace facebook::react {
5
+
6
+ /// Counter triggers layout recalculation, viewRef allows shadow node to access view for measurement.
7
+ class EnrichedMarkdownTextState {
8
+ public:
9
+ EnrichedMarkdownTextState() = default;
10
+ EnrichedMarkdownTextState(int counter, std::shared_ptr<void> ref) : counter_(counter), viewRef_(ref) {}
11
+
12
+ int getHeightRecalculationCounter() const {
13
+ return counter_;
14
+ }
15
+ std::shared_ptr<void> getComponentViewRef() const {
16
+ return viewRef_;
17
+ }
18
+
19
+ private:
20
+ int counter_{0};
21
+ std::shared_ptr<void> viewRef_{nullptr};
22
+ };
23
+
24
+ } // namespace facebook::react
@@ -0,0 +1,35 @@
1
+ #import <Foundation/Foundation.h>
2
+
3
+ typedef NS_ENUM(NSInteger, MarkdownNodeType) {
4
+ MarkdownNodeTypeDocument,
5
+ MarkdownNodeTypeParagraph,
6
+ MarkdownNodeTypeText,
7
+ MarkdownNodeTypeLink,
8
+ MarkdownNodeTypeHeading,
9
+ MarkdownNodeTypeLineBreak,
10
+ MarkdownNodeTypeStrong,
11
+ MarkdownNodeTypeEmphasis,
12
+ MarkdownNodeTypeStrikethrough,
13
+ MarkdownNodeTypeUnderline,
14
+ MarkdownNodeTypeCode,
15
+ MarkdownNodeTypeImage,
16
+ MarkdownNodeTypeBlockquote,
17
+ MarkdownNodeTypeUnorderedList,
18
+ MarkdownNodeTypeOrderedList,
19
+ MarkdownNodeTypeListItem,
20
+ MarkdownNodeTypeCodeBlock,
21
+ MarkdownNodeTypeThematicBreak
22
+ };
23
+
24
+ @interface MarkdownASTNode : NSObject
25
+
26
+ @property (nonatomic, assign) MarkdownNodeType type;
27
+ @property (nonatomic, strong) NSString *content;
28
+ @property (nonatomic, strong) NSMutableDictionary *attributes;
29
+ @property (nonatomic, strong) NSMutableArray<MarkdownASTNode *> *children;
30
+
31
+ - (instancetype)initWithType:(MarkdownNodeType)type;
32
+ - (void)addChild:(MarkdownASTNode *)child;
33
+ - (void)setAttribute:(NSString *)key value:(NSString *)value;
34
+
35
+ @end
@@ -0,0 +1,32 @@
1
+ #import "MarkdownASTNode.h"
2
+
3
+ @implementation MarkdownASTNode
4
+
5
+ - (instancetype)initWithType:(MarkdownNodeType)type
6
+ {
7
+ if (self = [super init]) {
8
+ _type = type;
9
+ _content = nil;
10
+ _attributes = [[NSMutableDictionary alloc] init];
11
+ _children = [[NSMutableArray alloc] init];
12
+ }
13
+ return self;
14
+ }
15
+
16
+ - (void)addChild:(MarkdownASTNode *)child
17
+ {
18
+ [_children addObject:child];
19
+ }
20
+
21
+ - (void)setAttribute:(NSString *)key value:(NSString *)value
22
+ {
23
+ _attributes[key] = value;
24
+ }
25
+
26
+ - (NSString *)description
27
+ {
28
+ return [NSString stringWithFormat:@"MarkdownASTNode(type=%ld, content=%@, children=%lu)", (long)_type, _content,
29
+ (unsigned long)_children.count];
30
+ }
31
+
32
+ @end
@@ -0,0 +1,17 @@
1
+ #import "MarkdownASTNode.h"
2
+ #import <Foundation/Foundation.h>
3
+
4
+ @interface Md4cFlags : NSObject <NSCopying>
5
+
6
+ @property (nonatomic, assign) BOOL underline;
7
+
8
+ + (instancetype)defaultFlags;
9
+
10
+ @end
11
+
12
+ @interface MarkdownParser : NSObject
13
+
14
+ - (MarkdownASTNode *)parseMarkdown:(NSString *)markdown;
15
+ - (MarkdownASTNode *)parseMarkdown:(NSString *)markdown flags:(Md4cFlags *)flags;
16
+
17
+ @end
@@ -0,0 +1,42 @@
1
+ #import "MarkdownParser.h"
2
+ #import "MarkdownASTNode.h"
3
+
4
+ extern MarkdownASTNode *parseMarkdownWithCppParser(NSString *markdown, Md4cFlags *flags);
5
+
6
+ @implementation Md4cFlags
7
+
8
+ - (instancetype)init
9
+ {
10
+ if (self = [super init]) {
11
+ _underline = NO;
12
+ }
13
+ return self;
14
+ }
15
+
16
+ + (instancetype)defaultFlags
17
+ {
18
+ return [[Md4cFlags alloc] init];
19
+ }
20
+
21
+ - (id)copyWithZone:(NSZone *)zone
22
+ {
23
+ Md4cFlags *copy = [[Md4cFlags allocWithZone:zone] init];
24
+ copy.underline = self.underline;
25
+ return copy;
26
+ }
27
+
28
+ @end
29
+
30
+ @implementation MarkdownParser
31
+
32
+ - (MarkdownASTNode *)parseMarkdown:(NSString *)markdown
33
+ {
34
+ return [self parseMarkdown:markdown flags:[Md4cFlags defaultFlags]];
35
+ }
36
+
37
+ - (MarkdownASTNode *)parseMarkdown:(NSString *)markdown flags:(Md4cFlags *)flags
38
+ {
39
+ return parseMarkdownWithCppParser(markdown, flags);
40
+ }
41
+
42
+ @end
@@ -0,0 +1,120 @@
1
+ #include "MD4CParser.hpp"
2
+ #import "MarkdownASTNode.h"
3
+ #include "MarkdownASTNode.hpp"
4
+ #import "MarkdownParser.h"
5
+
6
+ // Convert C++ AST node to Objective-C AST node
7
+ static MarkdownASTNode *convertCppASTToObjC(std::shared_ptr<Markdown::MarkdownASTNode> cppNode)
8
+ {
9
+ if (!cppNode) {
10
+ return [[MarkdownASTNode alloc] initWithType:MarkdownNodeTypeDocument];
11
+ }
12
+
13
+ // Convert C++ NodeType enum to Objective-C MarkdownNodeType
14
+ MarkdownNodeType objcType;
15
+ switch (cppNode->type) {
16
+ case Markdown::NodeType::Document:
17
+ objcType = MarkdownNodeTypeDocument;
18
+ break;
19
+ case Markdown::NodeType::Paragraph:
20
+ objcType = MarkdownNodeTypeParagraph;
21
+ break;
22
+ case Markdown::NodeType::Text:
23
+ objcType = MarkdownNodeTypeText;
24
+ break;
25
+ case Markdown::NodeType::Link:
26
+ objcType = MarkdownNodeTypeLink;
27
+ break;
28
+ case Markdown::NodeType::Heading:
29
+ objcType = MarkdownNodeTypeHeading;
30
+ break;
31
+ case Markdown::NodeType::LineBreak:
32
+ objcType = MarkdownNodeTypeLineBreak;
33
+ break;
34
+ case Markdown::NodeType::Strong:
35
+ objcType = MarkdownNodeTypeStrong;
36
+ break;
37
+ case Markdown::NodeType::Emphasis:
38
+ objcType = MarkdownNodeTypeEmphasis;
39
+ break;
40
+ case Markdown::NodeType::Strikethrough:
41
+ objcType = MarkdownNodeTypeStrikethrough;
42
+ break;
43
+ case Markdown::NodeType::Underline:
44
+ objcType = MarkdownNodeTypeUnderline;
45
+ break;
46
+ case Markdown::NodeType::Code:
47
+ objcType = MarkdownNodeTypeCode;
48
+ break;
49
+ case Markdown::NodeType::Image:
50
+ objcType = MarkdownNodeTypeImage;
51
+ break;
52
+ case Markdown::NodeType::Blockquote:
53
+ objcType = MarkdownNodeTypeBlockquote;
54
+ break;
55
+ case Markdown::NodeType::UnorderedList:
56
+ objcType = MarkdownNodeTypeUnorderedList;
57
+ break;
58
+ case Markdown::NodeType::OrderedList:
59
+ objcType = MarkdownNodeTypeOrderedList;
60
+ break;
61
+ case Markdown::NodeType::ListItem:
62
+ objcType = MarkdownNodeTypeListItem;
63
+ break;
64
+ case Markdown::NodeType::CodeBlock:
65
+ objcType = MarkdownNodeTypeCodeBlock;
66
+ break;
67
+ case Markdown::NodeType::ThematicBreak:
68
+ objcType = MarkdownNodeTypeThematicBreak;
69
+ break;
70
+ }
71
+
72
+ MarkdownASTNode *objcNode = [[MarkdownASTNode alloc] initWithType:objcType];
73
+
74
+ // Convert content
75
+ if (!cppNode->content.empty()) {
76
+ objcNode.content = [NSString stringWithUTF8String:cppNode->content.c_str()];
77
+ }
78
+
79
+ // Convert attributes
80
+ for (const auto &[key, value] : cppNode->attributes) {
81
+ NSString *objcKey = [NSString stringWithUTF8String:key.c_str()];
82
+ NSString *objcValue = [NSString stringWithUTF8String:value.c_str()];
83
+ [objcNode setAttribute:objcKey value:objcValue];
84
+ }
85
+
86
+ // Convert children recursively
87
+ for (const auto &child : cppNode->children) {
88
+ MarkdownASTNode *objcChild = convertCppASTToObjC(child);
89
+ [objcNode addChild:objcChild];
90
+ }
91
+
92
+ return objcNode;
93
+ }
94
+
95
+ // Public function to parse markdown using C++ parser and convert to Objective-C AST
96
+ MarkdownASTNode *parseMarkdownWithCppParser(NSString *markdown, Md4cFlags *flags)
97
+ {
98
+ if (markdown.length == 0) {
99
+ return [[MarkdownASTNode alloc] initWithType:MarkdownNodeTypeDocument];
100
+ }
101
+
102
+ // Convert NSString to std::string
103
+ const char *utf8String = [markdown UTF8String];
104
+ if (!utf8String) {
105
+ NSLog(@"MarkdownParserBridge: Failed to convert markdown to UTF-8");
106
+ return [[MarkdownASTNode alloc] initWithType:MarkdownNodeTypeDocument];
107
+ }
108
+
109
+ std::string cppMarkdown(utf8String);
110
+
111
+ // Convert Objective-C flags to C++ flags
112
+ Markdown::Md4cFlags cppFlags;
113
+ cppFlags.underline = flags.underline;
114
+
115
+ Markdown::MD4CParser parser;
116
+ auto cppAST = parser.parse(cppMarkdown, cppFlags);
117
+
118
+ // Convert C++ AST to Objective-C AST
119
+ return convertCppASTToObjC(cppAST);
120
+ }
@@ -0,0 +1,11 @@
1
+ #import <Foundation/Foundation.h>
2
+
3
+ @class MarkdownASTNode;
4
+ @class RenderContext;
5
+
6
+ @interface AttributedRenderer : NSObject
7
+ - (instancetype)initWithConfig:(id)config;
8
+ - (NSMutableAttributedString *)renderRoot:(MarkdownASTNode *)root context:(RenderContext *)context;
9
+ - (CGFloat)getLastElementMarginBottom;
10
+ - (void)setAllowTrailingMargin:(BOOL)allow;
11
+ @end