react-native-nitro-markdown 0.1.2 → 0.2.1

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 (238) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +142 -84
  3. package/android/src/main/cpp/cpp-adapter.cpp +1 -1
  4. package/android/src/main/java/com/margelo/nitro/com/nitromarkdown/HybridMarkdownSession.kt +61 -0
  5. package/android/src/main/java/com/nitromarkdown/NitroMarkdownPackage.kt +5 -1
  6. package/cpp/bindings/HybridMarkdownParser.cpp +2 -2
  7. package/cpp/bindings/HybridMarkdownParser.hpp +2 -2
  8. package/cpp/bindings/HybridMarkdownSession.cpp +0 -0
  9. package/cpp/core/MarkdownSessionCore.cpp +0 -0
  10. package/ios/HybridMarkdownSession.swift +64 -0
  11. package/lib/commonjs/MarkdownContext.js +21 -0
  12. package/lib/commonjs/MarkdownContext.js.map +1 -0
  13. package/lib/commonjs/MarkdownSession.js +11 -0
  14. package/lib/commonjs/MarkdownSession.js.map +1 -0
  15. package/lib/commonjs/default-markdown-renderer.js +220 -0
  16. package/lib/commonjs/default-markdown-renderer.js.map +1 -0
  17. package/lib/commonjs/headless.js +50 -0
  18. package/lib/commonjs/headless.js.map +1 -0
  19. package/lib/commonjs/index.js +185 -13
  20. package/lib/commonjs/index.js.map +1 -1
  21. package/lib/commonjs/markdown-stream.js +32 -0
  22. package/lib/commonjs/markdown-stream.js.map +1 -0
  23. package/lib/commonjs/markdown.js +326 -0
  24. package/lib/commonjs/markdown.js.map +1 -0
  25. package/lib/commonjs/package.json +1 -0
  26. package/lib/commonjs/renderers/blockquote.js +36 -0
  27. package/lib/commonjs/renderers/blockquote.js.map +1 -0
  28. package/lib/commonjs/renderers/code.js +92 -0
  29. package/lib/commonjs/renderers/code.js.map +1 -0
  30. package/lib/commonjs/renderers/heading.js +62 -0
  31. package/lib/commonjs/renderers/heading.js.map +1 -0
  32. package/lib/commonjs/renderers/horizontal-rule.js +27 -0
  33. package/lib/commonjs/renderers/horizontal-rule.js.map +1 -0
  34. package/lib/commonjs/renderers/image.js +159 -0
  35. package/lib/commonjs/renderers/image.js.map +1 -0
  36. package/lib/commonjs/renderers/link.js +37 -0
  37. package/lib/commonjs/renderers/link.js.map +1 -0
  38. package/lib/commonjs/renderers/list.js +114 -0
  39. package/lib/commonjs/renderers/list.js.map +1 -0
  40. package/lib/commonjs/renderers/math.js +151 -0
  41. package/lib/commonjs/renderers/math.js.map +1 -0
  42. package/lib/commonjs/renderers/paragraph.js +44 -0
  43. package/lib/commonjs/renderers/paragraph.js.map +1 -0
  44. package/lib/commonjs/renderers/table.js +283 -0
  45. package/lib/commonjs/renderers/table.js.map +1 -0
  46. package/lib/commonjs/specs/MarkdownSession.nitro.js +6 -0
  47. package/lib/commonjs/specs/MarkdownSession.nitro.js.map +1 -0
  48. package/lib/commonjs/theme.js +58 -0
  49. package/lib/commonjs/theme.js.map +1 -0
  50. package/lib/commonjs/use-markdown-stream.js +71 -0
  51. package/lib/commonjs/use-markdown-stream.js.map +1 -0
  52. package/lib/module/MarkdownContext.js +17 -0
  53. package/lib/module/MarkdownContext.js.map +1 -0
  54. package/lib/module/MarkdownSession.js +7 -0
  55. package/lib/module/MarkdownSession.js.map +1 -0
  56. package/lib/module/default-markdown-renderer.js +215 -0
  57. package/lib/module/default-markdown-renderer.js.map +1 -0
  58. package/lib/module/headless.js +44 -0
  59. package/lib/module/headless.js.map +1 -0
  60. package/lib/module/index.js +36 -10
  61. package/lib/module/index.js.map +1 -1
  62. package/lib/module/markdown-stream.js +27 -0
  63. package/lib/module/markdown-stream.js.map +1 -0
  64. package/lib/module/markdown.js +321 -0
  65. package/lib/module/markdown.js.map +1 -0
  66. package/lib/module/package.json +1 -0
  67. package/lib/module/renderers/blockquote.js +31 -0
  68. package/lib/module/renderers/blockquote.js.map +1 -0
  69. package/lib/module/renderers/code.js +86 -0
  70. package/lib/module/renderers/code.js.map +1 -0
  71. package/lib/module/renderers/heading.js +57 -0
  72. package/lib/module/renderers/heading.js.map +1 -0
  73. package/lib/module/renderers/horizontal-rule.js +22 -0
  74. package/lib/module/renderers/horizontal-rule.js.map +1 -0
  75. package/lib/module/renderers/image.js +154 -0
  76. package/lib/module/renderers/image.js.map +1 -0
  77. package/lib/module/renderers/link.js +32 -0
  78. package/lib/module/renderers/link.js.map +1 -0
  79. package/lib/module/renderers/list.js +107 -0
  80. package/lib/module/renderers/list.js.map +1 -0
  81. package/lib/module/renderers/math.js +145 -0
  82. package/lib/module/renderers/math.js.map +1 -0
  83. package/lib/module/renderers/paragraph.js +39 -0
  84. package/lib/module/renderers/paragraph.js.map +1 -0
  85. package/lib/module/renderers/table.js +278 -0
  86. package/lib/module/renderers/table.js.map +1 -0
  87. package/lib/module/specs/MarkdownSession.nitro.js +4 -0
  88. package/lib/module/specs/MarkdownSession.nitro.js.map +1 -0
  89. package/lib/module/theme.js +54 -0
  90. package/lib/module/theme.js.map +1 -0
  91. package/lib/module/use-markdown-stream.js +66 -0
  92. package/lib/module/use-markdown-stream.js.map +1 -0
  93. package/lib/typescript/commonjs/Markdown.nitro.d.ts.map +1 -0
  94. package/lib/typescript/commonjs/MarkdownContext.d.ts +26 -0
  95. package/lib/typescript/commonjs/MarkdownContext.d.ts.map +1 -0
  96. package/lib/typescript/commonjs/MarkdownSession.d.ts +4 -0
  97. package/lib/typescript/commonjs/MarkdownSession.d.ts.map +1 -0
  98. package/lib/typescript/commonjs/default-markdown-renderer.d.ts +10 -0
  99. package/lib/typescript/commonjs/default-markdown-renderer.d.ts.map +1 -0
  100. package/lib/typescript/commonjs/headless.d.ts +50 -0
  101. package/lib/typescript/commonjs/headless.d.ts.map +1 -0
  102. package/lib/typescript/commonjs/index.d.ts +34 -0
  103. package/lib/typescript/commonjs/index.d.ts.map +1 -0
  104. package/lib/typescript/commonjs/markdown-stream.d.ts +15 -0
  105. package/lib/typescript/commonjs/markdown-stream.d.ts.map +1 -0
  106. package/lib/typescript/commonjs/markdown.d.ts +29 -0
  107. package/lib/typescript/commonjs/markdown.d.ts.map +1 -0
  108. package/lib/typescript/commonjs/package.json +1 -0
  109. package/lib/typescript/commonjs/renderers/blockquote.d.ts +9 -0
  110. package/lib/typescript/commonjs/renderers/blockquote.d.ts.map +1 -0
  111. package/lib/typescript/commonjs/renderers/code.d.ts +15 -0
  112. package/lib/typescript/commonjs/renderers/code.d.ts.map +1 -0
  113. package/lib/typescript/commonjs/renderers/heading.d.ts +10 -0
  114. package/lib/typescript/commonjs/renderers/heading.d.ts.map +1 -0
  115. package/lib/typescript/commonjs/renderers/horizontal-rule.d.ts +3 -0
  116. package/lib/typescript/commonjs/renderers/horizontal-rule.d.ts.map +1 -0
  117. package/lib/typescript/commonjs/renderers/image.d.ts +11 -0
  118. package/lib/typescript/commonjs/renderers/image.d.ts.map +1 -0
  119. package/lib/typescript/commonjs/renderers/link.d.ts +10 -0
  120. package/lib/typescript/commonjs/renderers/link.d.ts.map +1 -0
  121. package/lib/typescript/commonjs/renderers/list.d.ts +22 -0
  122. package/lib/typescript/commonjs/renderers/list.d.ts.map +1 -0
  123. package/lib/typescript/commonjs/renderers/math.d.ts +15 -0
  124. package/lib/typescript/commonjs/renderers/math.d.ts.map +1 -0
  125. package/lib/typescript/commonjs/renderers/paragraph.d.ts +15 -0
  126. package/lib/typescript/commonjs/renderers/paragraph.d.ts.map +1 -0
  127. package/lib/typescript/commonjs/renderers/table.d.ts +10 -0
  128. package/lib/typescript/commonjs/renderers/table.d.ts.map +1 -0
  129. package/lib/typescript/commonjs/specs/MarkdownSession.nitro.d.ts +12 -0
  130. package/lib/typescript/commonjs/specs/MarkdownSession.nitro.d.ts.map +1 -0
  131. package/lib/typescript/commonjs/theme.d.ts +52 -0
  132. package/lib/typescript/commonjs/theme.d.ts.map +1 -0
  133. package/lib/typescript/commonjs/use-markdown-stream.d.ts +22 -0
  134. package/lib/typescript/commonjs/use-markdown-stream.d.ts.map +1 -0
  135. package/lib/typescript/module/Markdown.nitro.d.ts +13 -0
  136. package/lib/typescript/module/Markdown.nitro.d.ts.map +1 -0
  137. package/lib/typescript/module/MarkdownContext.d.ts +26 -0
  138. package/lib/typescript/module/MarkdownContext.d.ts.map +1 -0
  139. package/lib/typescript/module/MarkdownSession.d.ts +4 -0
  140. package/lib/typescript/module/MarkdownSession.d.ts.map +1 -0
  141. package/lib/typescript/module/default-markdown-renderer.d.ts +10 -0
  142. package/lib/typescript/module/default-markdown-renderer.d.ts.map +1 -0
  143. package/lib/typescript/module/headless.d.ts +50 -0
  144. package/lib/typescript/module/headless.d.ts.map +1 -0
  145. package/lib/typescript/module/index.d.ts +34 -0
  146. package/lib/typescript/module/index.d.ts.map +1 -0
  147. package/lib/typescript/module/markdown-stream.d.ts +15 -0
  148. package/lib/typescript/module/markdown-stream.d.ts.map +1 -0
  149. package/lib/typescript/module/markdown.d.ts +29 -0
  150. package/lib/typescript/module/markdown.d.ts.map +1 -0
  151. package/lib/typescript/module/package.json +1 -0
  152. package/lib/typescript/module/renderers/blockquote.d.ts +9 -0
  153. package/lib/typescript/module/renderers/blockquote.d.ts.map +1 -0
  154. package/lib/typescript/module/renderers/code.d.ts +15 -0
  155. package/lib/typescript/module/renderers/code.d.ts.map +1 -0
  156. package/lib/typescript/module/renderers/heading.d.ts +10 -0
  157. package/lib/typescript/module/renderers/heading.d.ts.map +1 -0
  158. package/lib/typescript/module/renderers/horizontal-rule.d.ts +3 -0
  159. package/lib/typescript/module/renderers/horizontal-rule.d.ts.map +1 -0
  160. package/lib/typescript/module/renderers/image.d.ts +11 -0
  161. package/lib/typescript/module/renderers/image.d.ts.map +1 -0
  162. package/lib/typescript/module/renderers/link.d.ts +10 -0
  163. package/lib/typescript/module/renderers/link.d.ts.map +1 -0
  164. package/lib/typescript/module/renderers/list.d.ts +22 -0
  165. package/lib/typescript/module/renderers/list.d.ts.map +1 -0
  166. package/lib/typescript/module/renderers/math.d.ts +15 -0
  167. package/lib/typescript/module/renderers/math.d.ts.map +1 -0
  168. package/lib/typescript/module/renderers/paragraph.d.ts +15 -0
  169. package/lib/typescript/module/renderers/paragraph.d.ts.map +1 -0
  170. package/lib/typescript/module/renderers/table.d.ts +10 -0
  171. package/lib/typescript/module/renderers/table.d.ts.map +1 -0
  172. package/lib/typescript/module/specs/MarkdownSession.nitro.d.ts +12 -0
  173. package/lib/typescript/module/specs/MarkdownSession.nitro.d.ts.map +1 -0
  174. package/lib/typescript/module/theme.d.ts +52 -0
  175. package/lib/typescript/module/theme.d.ts.map +1 -0
  176. package/lib/typescript/module/use-markdown-stream.d.ts +22 -0
  177. package/lib/typescript/module/use-markdown-stream.d.ts.map +1 -0
  178. package/nitro.json +5 -2
  179. package/nitrogen/generated/android/NitroMarkdown+autolinking.cmake +3 -2
  180. package/nitrogen/generated/android/NitroMarkdown+autolinking.gradle +1 -1
  181. package/nitrogen/generated/android/NitroMarkdownOnLoad.cpp +17 -5
  182. package/nitrogen/generated/android/NitroMarkdownOnLoad.hpp +4 -4
  183. package/nitrogen/generated/android/c++/JFunc_void.hpp +75 -0
  184. package/nitrogen/generated/android/c++/JHybridMarkdownSessionSpec.cpp +91 -0
  185. package/nitrogen/generated/android/c++/JHybridMarkdownSessionSpec.hpp +70 -0
  186. package/nitrogen/generated/android/kotlin/com/margelo/nitro/com/nitromarkdown/Func_void.kt +80 -0
  187. package/nitrogen/generated/android/kotlin/com/margelo/nitro/com/nitromarkdown/HybridMarkdownSessionSpec.kt +78 -0
  188. package/nitrogen/generated/android/kotlin/com/margelo/nitro/com/nitromarkdown/NitroMarkdownOnLoad.kt +1 -1
  189. package/nitrogen/generated/ios/NitroMarkdown+autolinking.rb +2 -2
  190. package/nitrogen/generated/ios/NitroMarkdown-Swift-Cxx-Bridge.cpp +28 -4
  191. package/nitrogen/generated/ios/NitroMarkdown-Swift-Cxx-Bridge.hpp +72 -6
  192. package/nitrogen/generated/ios/NitroMarkdown-Swift-Cxx-Umbrella.hpp +11 -4
  193. package/nitrogen/generated/ios/NitroMarkdownAutolinking.mm +11 -3
  194. package/nitrogen/generated/ios/NitroMarkdownAutolinking.swift +16 -3
  195. package/nitrogen/generated/ios/c++/HybridMarkdownSessionSpecSwift.cpp +11 -0
  196. package/nitrogen/generated/ios/c++/HybridMarkdownSessionSpecSwift.hpp +108 -0
  197. package/nitrogen/generated/ios/swift/Func_void.swift +47 -0
  198. package/nitrogen/generated/ios/swift/HybridMarkdownSessionSpec.swift +59 -0
  199. package/nitrogen/generated/ios/swift/HybridMarkdownSessionSpec_cxx.swift +190 -0
  200. package/nitrogen/generated/shared/c++/HybridMarkdownParserSpec.cpp +3 -3
  201. package/nitrogen/generated/shared/c++/HybridMarkdownParserSpec.hpp +4 -4
  202. package/nitrogen/generated/shared/c++/HybridMarkdownSessionSpec.cpp +26 -0
  203. package/nitrogen/generated/shared/c++/HybridMarkdownSessionSpec.hpp +67 -0
  204. package/nitrogen/generated/shared/c++/ParserOptions.hpp +22 -14
  205. package/package.json +45 -7
  206. package/react-native-nitro-markdown.podspec +5 -5
  207. package/src/MarkdownContext.ts +41 -0
  208. package/src/MarkdownSession.ts +8 -0
  209. package/src/default-markdown-renderer.tsx +266 -0
  210. package/src/headless.ts +106 -0
  211. package/src/index.ts +41 -59
  212. package/src/markdown-stream.tsx +32 -0
  213. package/src/markdown.tsx +415 -0
  214. package/src/renderers/blockquote.tsx +31 -0
  215. package/src/renderers/code.tsx +88 -0
  216. package/src/renderers/heading.tsx +66 -0
  217. package/src/renderers/horizontal-rule.tsx +20 -0
  218. package/src/renderers/image.tsx +160 -0
  219. package/src/renderers/link.tsx +38 -0
  220. package/src/renderers/list.tsx +125 -0
  221. package/src/renderers/math.tsx +164 -0
  222. package/src/renderers/paragraph.tsx +53 -0
  223. package/src/renderers/table.tsx +345 -0
  224. package/src/specs/MarkdownSession.nitro.ts +16 -0
  225. package/src/theme.ts +52 -0
  226. package/src/use-markdown-stream.ts +83 -0
  227. package/ios/NitroMarkdown-Bridging-Header.h +0 -14
  228. package/lib/commonjs/MarkdownJS.reference.js +0 -114
  229. package/lib/commonjs/MarkdownJS.reference.js.map +0 -1
  230. package/lib/module/MarkdownJS.reference.js +0 -107
  231. package/lib/module/MarkdownJS.reference.js.map +0 -1
  232. package/lib/typescript/Markdown.nitro.d.ts.map +0 -1
  233. package/lib/typescript/MarkdownJS.reference.d.ts +0 -33
  234. package/lib/typescript/MarkdownJS.reference.d.ts.map +0 -1
  235. package/lib/typescript/index.d.ts +0 -22
  236. package/lib/typescript/index.d.ts.map +0 -1
  237. package/src/MarkdownJS.reference.ts +0 -122
  238. /package/lib/typescript/{Markdown.nitro.d.ts → commonjs/Markdown.nitro.d.ts} +0 -0
@@ -0,0 +1,266 @@
1
+ import { type ReactNode, type FC } from "react";
2
+ import { View, Text, StyleSheet } from "react-native";
3
+ import type { MarkdownNode } from "./headless";
4
+ import { Heading } from "./renderers/heading";
5
+ import { Paragraph } from "./renderers/paragraph";
6
+ import { Link } from "./renderers/link";
7
+ import { Blockquote } from "./renderers/blockquote";
8
+ import { HorizontalRule } from "./renderers/horizontal-rule";
9
+ import { CodeBlock, InlineCode } from "./renderers/code";
10
+ import { List, ListItem, TaskListItem } from "./renderers/list";
11
+ import { TableRenderer } from "./renderers/table";
12
+ import { Image } from "./renderers/image";
13
+ import { MathInline, MathBlock } from "./renderers/math";
14
+ import { defaultMarkdownTheme } from "./theme";
15
+
16
+ interface MarkdownRendererProps {
17
+ node: MarkdownNode;
18
+ depth?: number;
19
+ inListItem?: boolean;
20
+ }
21
+
22
+ const isInline = (type: MarkdownNode["type"]): boolean => {
23
+ return (
24
+ type === "text" ||
25
+ type === "bold" ||
26
+ type === "italic" ||
27
+ type === "strikethrough" ||
28
+ type === "link" ||
29
+ type === "code_inline" ||
30
+ type === "soft_break" ||
31
+ type === "line_break" ||
32
+ type === "math_inline" ||
33
+ type === "html_inline"
34
+ );
35
+ };
36
+
37
+ const getTextContent = (node: MarkdownNode): string => {
38
+ if (node.content) return node.content;
39
+ return node.children?.map(getTextContent).join("") ?? "";
40
+ };
41
+
42
+ export const DefaultMarkdownRenderer: FC<MarkdownRendererProps> = ({
43
+ node,
44
+ depth = 0,
45
+ inListItem = false,
46
+ }) => {
47
+ const renderChildren = (
48
+ children?: MarkdownNode[],
49
+ childInListItem = false
50
+ ) => {
51
+ if (!children || children.length === 0) return null;
52
+
53
+ const elements: ReactNode[] = [];
54
+ let currentInlineGroup: MarkdownNode[] = [];
55
+
56
+ const flushInlineGroup = () => {
57
+ if (currentInlineGroup.length > 0) {
58
+ elements.push(
59
+ <Text key={`inline-group-${elements.length}`} style={styles.text}>
60
+ {currentInlineGroup.map((child, index) => (
61
+ <DefaultMarkdownRenderer
62
+ key={`${child.type}-${index}`}
63
+ node={child}
64
+ depth={depth + 1}
65
+ inListItem={childInListItem}
66
+ />
67
+ ))}
68
+ </Text>
69
+ );
70
+ currentInlineGroup = [];
71
+ }
72
+ };
73
+
74
+ children.forEach((child, index) => {
75
+ if (isInline(child.type)) {
76
+ currentInlineGroup.push(child);
77
+ } else {
78
+ flushInlineGroup();
79
+ elements.push(
80
+ <DefaultMarkdownRenderer
81
+ key={`${child.type}-${index}`}
82
+ node={child}
83
+ depth={depth + 1}
84
+ inListItem={childInListItem}
85
+ />
86
+ );
87
+ }
88
+ });
89
+
90
+ flushInlineGroup();
91
+ return elements;
92
+ };
93
+
94
+ switch (node.type) {
95
+ case "document":
96
+ return (
97
+ <View style={styles.document}>
98
+ {renderChildren(node.children, false)}
99
+ </View>
100
+ );
101
+
102
+ case "heading":
103
+ return (
104
+ <Heading level={node.level ?? 1}>
105
+ {renderChildren(node.children, inListItem)}
106
+ </Heading>
107
+ );
108
+
109
+ case "paragraph":
110
+ return (
111
+ <Paragraph inListItem={inListItem}>
112
+ {renderChildren(node.children, inListItem)}
113
+ </Paragraph>
114
+ );
115
+
116
+ case "text":
117
+ return <Text style={styles.text}>{node.content}</Text>;
118
+
119
+ case "bold":
120
+ return (
121
+ <Text style={styles.bold}>
122
+ {renderChildren(node.children, inListItem)}
123
+ </Text>
124
+ );
125
+
126
+ case "italic":
127
+ return (
128
+ <Text style={styles.italic}>
129
+ {renderChildren(node.children, inListItem)}
130
+ </Text>
131
+ );
132
+
133
+ case "strikethrough":
134
+ return (
135
+ <Text style={styles.strikethrough}>
136
+ {renderChildren(node.children, inListItem)}
137
+ </Text>
138
+ );
139
+
140
+ case "link":
141
+ return (
142
+ <Link href={node.href ?? ""}>
143
+ {renderChildren(node.children, inListItem)}
144
+ </Link>
145
+ );
146
+
147
+ case "image":
148
+ return (
149
+ <Image
150
+ url={node.href ?? ""}
151
+ title={node.title}
152
+ alt={node.alt}
153
+ Renderer={DefaultMarkdownRenderer}
154
+ />
155
+ );
156
+
157
+ case "code_inline":
158
+ return <InlineCode>{node.content}</InlineCode>;
159
+
160
+ case "code_block":
161
+ return (
162
+ <CodeBlock language={node.language} content={getTextContent(node)} />
163
+ );
164
+
165
+ case "blockquote":
166
+ return (
167
+ <Blockquote>{renderChildren(node.children, inListItem)}</Blockquote>
168
+ );
169
+
170
+ case "horizontal_rule":
171
+ return <HorizontalRule />;
172
+
173
+ case "line_break":
174
+ return <Text>{"\n"}</Text>;
175
+
176
+ case "soft_break":
177
+ return <Text> </Text>;
178
+
179
+ case "math_inline": {
180
+ let mathContent = getTextContent(node);
181
+ if (!mathContent) return null;
182
+ mathContent = mathContent.replace(/^\$+|\$+$/g, "").trim();
183
+ return <MathInline content={mathContent} />;
184
+ }
185
+
186
+ case "math_block": {
187
+ let mathContent = getTextContent(node);
188
+ if (!mathContent) return null;
189
+ mathContent = mathContent.replace(/^\$+|\$+$/g, "").trim();
190
+ return <MathBlock content={mathContent} />;
191
+ }
192
+
193
+ case "list":
194
+ return (
195
+ <List ordered={node.ordered ?? false} start={node.start} depth={depth}>
196
+ {node.children?.map((child, index) => {
197
+ if (child.type === "task_list_item") {
198
+ return (
199
+ <DefaultMarkdownRenderer
200
+ key={index}
201
+ node={child}
202
+ depth={depth + 1}
203
+ inListItem={true}
204
+ />
205
+ );
206
+ }
207
+ return (
208
+ <ListItem
209
+ key={index}
210
+ index={index}
211
+ ordered={node.ordered ?? false}
212
+ start={node.start ?? 1}
213
+ >
214
+ <DefaultMarkdownRenderer
215
+ node={child}
216
+ depth={depth + 1}
217
+ inListItem={true}
218
+ />
219
+ </ListItem>
220
+ );
221
+ })}
222
+ </List>
223
+ );
224
+
225
+ case "list_item":
226
+ return <>{renderChildren(node.children, true)}</>;
227
+
228
+ case "task_list_item":
229
+ return (
230
+ <TaskListItem checked={node.checked ?? false}>
231
+ {renderChildren(node.children, true)}
232
+ </TaskListItem>
233
+ );
234
+
235
+ case "table":
236
+ return <TableRenderer node={node} Renderer={DefaultMarkdownRenderer} />;
237
+
238
+ case "table_head":
239
+ case "table_body":
240
+ case "table_row":
241
+ case "table_cell":
242
+ // Handled by TableRenderer
243
+ return null;
244
+
245
+ default:
246
+ return null;
247
+ }
248
+ };
249
+
250
+ const styles = StyleSheet.create({
251
+ document: {
252
+ flex: 1,
253
+ },
254
+ text: {
255
+ color: defaultMarkdownTheme.colors.text,
256
+ },
257
+ bold: {
258
+ fontWeight: "700",
259
+ },
260
+ italic: {
261
+ fontStyle: "italic",
262
+ },
263
+ strikethrough: {
264
+ textDecorationLine: "line-through",
265
+ },
266
+ });
@@ -0,0 +1,106 @@
1
+ /**
2
+ * Headless entry point for react-native-nitro-markdown.
3
+ * Use this when you want to build your own renderer and minimize bundle size.
4
+ *
5
+ * @example
6
+ * ```tsx
7
+ * import { parseMarkdown } from 'react-native-nitro-markdown/headless';
8
+ *
9
+ * const ast = parseMarkdown('# Hello World');
10
+ * // Build your own renderer using the AST
11
+ * ```
12
+ */
13
+ import { NitroModules } from "react-native-nitro-modules";
14
+ import type { MarkdownParser, ParserOptions } from "./Markdown.nitro";
15
+
16
+ export type { ParserOptions } from "./Markdown.nitro";
17
+
18
+ /**
19
+ * Represents a node in the Markdown AST (Abstract Syntax Tree).
20
+ * Each node has a type and optional properties depending on the node type.
21
+ */
22
+ export interface MarkdownNode {
23
+ /** The type of markdown element this node represents. Used to decide how to render the node. */
24
+ type:
25
+ | "document"
26
+ | "heading"
27
+ | "paragraph"
28
+ | "text"
29
+ | "bold"
30
+ | "italic"
31
+ | "strikethrough"
32
+ | "link"
33
+ | "image"
34
+ | "code_inline"
35
+ | "code_block"
36
+ | "blockquote"
37
+ | "horizontal_rule"
38
+ | "line_break"
39
+ | "soft_break"
40
+ | "table"
41
+ | "table_head"
42
+ | "table_body"
43
+ | "table_row"
44
+ | "table_cell"
45
+ | "list"
46
+ | "list_item"
47
+ | "task_list_item"
48
+ | "math_inline"
49
+ | "math_block"
50
+ | "html_block"
51
+ | "html_inline";
52
+ /** Text content for text, code, and similar nodes. */
53
+ content?: string;
54
+ /** Heading level (1-6) for heading nodes. */
55
+ level?: number;
56
+ /** URL for link and image nodes. */
57
+ href?: string;
58
+ /** Title attribute for link and image nodes. */
59
+ title?: string;
60
+ /** Alt text for image nodes. */
61
+ alt?: string;
62
+ /** Programming language for code blocks (e.g., 'typescript', 'javascript'). */
63
+ language?: string;
64
+ /** Whether a list is ordered (numbered) or unordered. */
65
+ ordered?: boolean;
66
+ /** The starting number for ordered lists. */
67
+ start?: number;
68
+ /** Whether a task list item is currently checked. */
69
+ checked?: boolean;
70
+ /** Whether a table cell is part of the header row. */
71
+ isHeader?: boolean;
72
+ /** Text alignment for table cells: 'left', 'center', or 'right'. */
73
+ align?: string;
74
+ /** Nested child nodes for hierarchical elements like paragraphs, lists, and tables. */
75
+ children?: MarkdownNode[];
76
+ }
77
+
78
+ export const MarkdownParserModule =
79
+ NitroModules.createHybridObject<MarkdownParser>("MarkdownParser");
80
+
81
+ /**
82
+ * Parse markdown text into an AST.
83
+ * @param text - The markdown text to parse
84
+ * @returns The root node of the parsed AST
85
+ */
86
+ export function parseMarkdown(text: string): MarkdownNode {
87
+ const jsonStr = MarkdownParserModule.parse(text);
88
+ return JSON.parse(jsonStr) as MarkdownNode;
89
+ }
90
+
91
+ /**
92
+ * Parse markdown text with custom options.
93
+ * @param text - The markdown text to parse
94
+ * @param options - Parser options (gfm, math)
95
+ * @returns The root node of the parsed AST
96
+ */
97
+ export function parseMarkdownWithOptions(
98
+ text: string,
99
+ options: ParserOptions
100
+ ): MarkdownNode {
101
+ const jsonStr = MarkdownParserModule.parseWithOptions(text, options);
102
+ return JSON.parse(jsonStr) as MarkdownNode;
103
+ }
104
+
105
+ export { MarkdownParser };
106
+
package/src/index.ts CHANGED
@@ -1,65 +1,47 @@
1
- import { NitroModules } from 'react-native-nitro-modules';
2
- import type { MarkdownParser, ParserOptions } from './Markdown.nitro';
1
+ export * from "./headless";
3
2
 
4
- export type { ParserOptions } from './Markdown.nitro';
3
+ /** Low-level renderer component for custom implementations */
4
+ export { DefaultMarkdownRenderer } from "./default-markdown-renderer";
5
5
 
6
- export interface MarkdownNode {
7
- type:
8
- | 'document'
9
- | 'heading'
10
- | 'paragraph'
11
- | 'text'
12
- | 'bold'
13
- | 'italic'
14
- | 'strikethrough'
15
- | 'link'
16
- | 'image'
17
- | 'code_inline'
18
- | 'code_block'
19
- | 'blockquote'
20
- | 'horizontal_rule'
21
- | 'line_break'
22
- | 'soft_break'
23
- | 'table'
24
- | 'table_head'
25
- | 'table_body'
26
- | 'table_row'
27
- | 'table_cell'
28
- | 'list'
29
- | 'list_item'
30
- | 'task_list_item'
31
- | 'math_inline'
32
- | 'math_block'
33
- | 'html_block'
34
- | 'html_inline';
35
- content?: string;
36
- level?: number;
37
- href?: string;
38
- title?: string;
39
- alt?: string;
40
- language?: string;
41
- ordered?: boolean;
42
- start?: number;
43
- checked?: boolean;
44
- isHeader?: boolean;
45
- align?: string;
46
- children?: MarkdownNode[];
47
- }
6
+ /**
7
+ * High-level Markdown component with optional custom renderers.
8
+ * @example
9
+ * ```tsx
10
+ * <Markdown>{'# Hello World'}</Markdown>
11
+ * ```
12
+ */
13
+ export { Markdown } from "./markdown";
48
14
 
49
- export const MarkdownParserModule =
50
- NitroModules.createHybridObject<MarkdownParser>('MarkdownParser');
15
+ /**
16
+ * Markdown component that supports streaming updates.
17
+ */
18
+ export { MarkdownStream } from "./markdown-stream";
51
19
 
52
- export function parseMarkdown(text: string): MarkdownNode {
53
- const jsonStr = MarkdownParserModule.parse(text);
54
- return JSON.parse(jsonStr) as MarkdownNode;
55
- }
20
+ export { useMarkdownContext } from "./MarkdownContext";
21
+ export type {
22
+ CustomRenderer,
23
+ CustomRenderers,
24
+ CustomRendererProps,
25
+ NodeRendererProps,
26
+ } from "./MarkdownContext";
56
27
 
57
- export function parseMarkdownWithOptions(
58
- text: string,
59
- options: ParserOptions
60
- ): MarkdownNode {
61
- const jsonStr = MarkdownParserModule.parseWithOptions(text, options);
62
- return JSON.parse(jsonStr) as MarkdownNode;
63
- }
28
+ /** Default theme configuration */
29
+ export { defaultMarkdownTheme } from "./theme";
30
+ export type { MarkdownTheme } from "./theme";
64
31
 
65
- export { MarkdownParser };
32
+ // Individual renderers for custom compositions
33
+ export { Heading } from "./renderers/heading";
34
+ export { Paragraph } from "./renderers/paragraph";
35
+ export { Link } from "./renderers/link";
36
+ export { Blockquote } from "./renderers/blockquote";
37
+ export { HorizontalRule } from "./renderers/horizontal-rule";
38
+ export { CodeBlock, InlineCode } from "./renderers/code";
39
+ export { List, ListItem, TaskListItem } from "./renderers/list";
40
+ export { TableRenderer } from "./renderers/table";
41
+ export { Image } from "./renderers/image";
42
+ export { MathInline, MathBlock } from "./renderers/math";
43
+
44
+ // Streaming API
45
+ export { createMarkdownSession } from "./MarkdownSession";
46
+ export type { MarkdownSession } from "./MarkdownSession";
47
+ export { useMarkdownSession, useStream } from "./use-markdown-stream";
@@ -0,0 +1,32 @@
1
+ import { useState, useEffect, type FC } from "react";
2
+ import { Markdown, type MarkdownProps } from "./markdown";
3
+ import type { MarkdownSession } from "./specs/MarkdownSession.nitro";
4
+
5
+ export interface MarkdownStreamProps extends Omit<MarkdownProps, "children"> {
6
+ /**
7
+ * The active MarkdownSession to stream content from.
8
+ */
9
+ session: MarkdownSession;
10
+ }
11
+
12
+ /**
13
+ * A component that renders streaming Markdown from a MarkdownSession.
14
+ * It efficiently subscribes to session updates to minimize parent re-renders.
15
+ */
16
+ export const MarkdownStream: FC<MarkdownStreamProps> = ({
17
+ session,
18
+ ...props
19
+ }) => {
20
+ const [text, setText] = useState(() => session.getAllText());
21
+
22
+ useEffect(() => {
23
+ // Ensure initial state is synced
24
+ setText(session.getAllText());
25
+
26
+ return session.addListener(() => {
27
+ setText(session.getAllText());
28
+ });
29
+ }, [session]);
30
+
31
+ return <Markdown {...props}>{text}</Markdown>;
32
+ };