react-native-nitro-markdown 0.5.0 → 0.5.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (144) hide show
  1. package/README.md +68 -5
  2. package/android/src/main/cpp/cpp-adapter.cpp +4 -1
  3. package/android/src/main/java/com/margelo/nitro/com/nitromarkdown/HybridMarkdownSession.kt +19 -0
  4. package/android/src/main/java/com/nitromarkdown/NitroMarkdownPackage.kt +4 -3
  5. package/ios/HybridMarkdownSession.swift +18 -0
  6. package/lib/commonjs/MarkdownContext.js.map +1 -1
  7. package/lib/commonjs/headless.js +20 -0
  8. package/lib/commonjs/headless.js.map +1 -1
  9. package/lib/commonjs/index.js +9 -1
  10. package/lib/commonjs/index.js.map +1 -1
  11. package/lib/commonjs/markdown.js +21 -11
  12. package/lib/commonjs/markdown.js.map +1 -1
  13. package/lib/commonjs/renderers/code.js +20 -2
  14. package/lib/commonjs/renderers/code.js.map +1 -1
  15. package/lib/commonjs/renderers/table/cell-content.js +32 -0
  16. package/lib/commonjs/renderers/table/cell-content.js.map +1 -0
  17. package/lib/commonjs/renderers/table/index.js +310 -0
  18. package/lib/commonjs/renderers/table/index.js.map +1 -0
  19. package/lib/commonjs/renderers/table/table-reducer.js +29 -0
  20. package/lib/commonjs/renderers/table/table-reducer.js.map +1 -0
  21. package/lib/commonjs/renderers/table/table-utils.js +68 -0
  22. package/lib/commonjs/renderers/table/table-utils.js.map +1 -0
  23. package/lib/commonjs/renderers/table/types.js +6 -0
  24. package/lib/commonjs/renderers/table/types.js.map +1 -0
  25. package/lib/commonjs/renderers/table.js +6 -398
  26. package/lib/commonjs/renderers/table.js.map +1 -1
  27. package/lib/commonjs/theme.js +10 -1
  28. package/lib/commonjs/theme.js.map +1 -1
  29. package/lib/commonjs/use-markdown-stream.js +9 -1
  30. package/lib/commonjs/use-markdown-stream.js.map +1 -1
  31. package/lib/commonjs/utils/code-highlight.js +101 -0
  32. package/lib/commonjs/utils/code-highlight.js.map +1 -0
  33. package/lib/module/MarkdownContext.js.map +1 -1
  34. package/lib/module/headless.js +19 -0
  35. package/lib/module/headless.js.map +1 -1
  36. package/lib/module/index.js +1 -0
  37. package/lib/module/index.js.map +1 -1
  38. package/lib/module/markdown.js +21 -11
  39. package/lib/module/markdown.js.map +1 -1
  40. package/lib/module/renderers/code.js +20 -2
  41. package/lib/module/renderers/code.js.map +1 -1
  42. package/lib/module/renderers/table/cell-content.js +27 -0
  43. package/lib/module/renderers/table/cell-content.js.map +1 -0
  44. package/lib/module/renderers/table/index.js +305 -0
  45. package/lib/module/renderers/table/index.js.map +1 -0
  46. package/lib/module/renderers/table/table-reducer.js +24 -0
  47. package/lib/module/renderers/table/table-reducer.js.map +1 -0
  48. package/lib/module/renderers/table/table-utils.js +62 -0
  49. package/lib/module/renderers/table/table-utils.js.map +1 -0
  50. package/lib/module/renderers/table/types.js +4 -0
  51. package/lib/module/renderers/table/types.js.map +1 -0
  52. package/lib/module/renderers/table.js +1 -397
  53. package/lib/module/renderers/table.js.map +1 -1
  54. package/lib/module/theme.js +10 -1
  55. package/lib/module/theme.js.map +1 -1
  56. package/lib/module/use-markdown-stream.js +9 -1
  57. package/lib/module/use-markdown-stream.js.map +1 -1
  58. package/lib/module/utils/code-highlight.js +97 -0
  59. package/lib/module/utils/code-highlight.js.map +1 -0
  60. package/lib/typescript/commonjs/MarkdownContext.d.ts +6 -0
  61. package/lib/typescript/commonjs/MarkdownContext.d.ts.map +1 -1
  62. package/lib/typescript/commonjs/headless.d.ts +5 -0
  63. package/lib/typescript/commonjs/headless.d.ts.map +1 -1
  64. package/lib/typescript/commonjs/index.d.ts +2 -0
  65. package/lib/typescript/commonjs/index.d.ts.map +1 -1
  66. package/lib/typescript/commonjs/markdown.d.ts +24 -0
  67. package/lib/typescript/commonjs/markdown.d.ts.map +1 -1
  68. package/lib/typescript/commonjs/renderers/code.d.ts.map +1 -1
  69. package/lib/typescript/commonjs/renderers/table/cell-content.d.ts +15 -0
  70. package/lib/typescript/commonjs/renderers/table/cell-content.d.ts.map +1 -0
  71. package/lib/typescript/commonjs/renderers/table/index.d.ts +11 -0
  72. package/lib/typescript/commonjs/renderers/table/index.d.ts.map +1 -0
  73. package/lib/typescript/commonjs/renderers/table/table-reducer.d.ts +5 -0
  74. package/lib/typescript/commonjs/renderers/table/table-reducer.d.ts.map +1 -0
  75. package/lib/typescript/commonjs/renderers/table/table-utils.d.ts +10 -0
  76. package/lib/typescript/commonjs/renderers/table/table-utils.d.ts.map +1 -0
  77. package/lib/typescript/commonjs/renderers/table/types.d.ts +24 -0
  78. package/lib/typescript/commonjs/renderers/table/types.d.ts.map +1 -0
  79. package/lib/typescript/commonjs/renderers/table.d.ts +1 -11
  80. package/lib/typescript/commonjs/renderers/table.d.ts.map +1 -1
  81. package/lib/typescript/commonjs/specs/MarkdownSession.nitro.d.ts +9 -0
  82. package/lib/typescript/commonjs/specs/MarkdownSession.nitro.d.ts.map +1 -1
  83. package/lib/typescript/commonjs/theme.d.ts +18 -2
  84. package/lib/typescript/commonjs/theme.d.ts.map +1 -1
  85. package/lib/typescript/commonjs/use-markdown-stream.d.ts +4 -0
  86. package/lib/typescript/commonjs/use-markdown-stream.d.ts.map +1 -1
  87. package/lib/typescript/commonjs/utils/code-highlight.d.ts +8 -0
  88. package/lib/typescript/commonjs/utils/code-highlight.d.ts.map +1 -0
  89. package/lib/typescript/module/MarkdownContext.d.ts +6 -0
  90. package/lib/typescript/module/MarkdownContext.d.ts.map +1 -1
  91. package/lib/typescript/module/headless.d.ts +5 -0
  92. package/lib/typescript/module/headless.d.ts.map +1 -1
  93. package/lib/typescript/module/index.d.ts +2 -0
  94. package/lib/typescript/module/index.d.ts.map +1 -1
  95. package/lib/typescript/module/markdown.d.ts +24 -0
  96. package/lib/typescript/module/markdown.d.ts.map +1 -1
  97. package/lib/typescript/module/renderers/code.d.ts.map +1 -1
  98. package/lib/typescript/module/renderers/table/cell-content.d.ts +15 -0
  99. package/lib/typescript/module/renderers/table/cell-content.d.ts.map +1 -0
  100. package/lib/typescript/module/renderers/table/index.d.ts +11 -0
  101. package/lib/typescript/module/renderers/table/index.d.ts.map +1 -0
  102. package/lib/typescript/module/renderers/table/table-reducer.d.ts +5 -0
  103. package/lib/typescript/module/renderers/table/table-reducer.d.ts.map +1 -0
  104. package/lib/typescript/module/renderers/table/table-utils.d.ts +10 -0
  105. package/lib/typescript/module/renderers/table/table-utils.d.ts.map +1 -0
  106. package/lib/typescript/module/renderers/table/types.d.ts +24 -0
  107. package/lib/typescript/module/renderers/table/types.d.ts.map +1 -0
  108. package/lib/typescript/module/renderers/table.d.ts +1 -11
  109. package/lib/typescript/module/renderers/table.d.ts.map +1 -1
  110. package/lib/typescript/module/specs/MarkdownSession.nitro.d.ts +9 -0
  111. package/lib/typescript/module/specs/MarkdownSession.nitro.d.ts.map +1 -1
  112. package/lib/typescript/module/theme.d.ts +18 -2
  113. package/lib/typescript/module/theme.d.ts.map +1 -1
  114. package/lib/typescript/module/use-markdown-stream.d.ts +4 -0
  115. package/lib/typescript/module/use-markdown-stream.d.ts.map +1 -1
  116. package/lib/typescript/module/utils/code-highlight.d.ts +8 -0
  117. package/lib/typescript/module/utils/code-highlight.d.ts.map +1 -0
  118. package/nitrogen/generated/android/NitroMarkdownOnLoad.cpp +37 -27
  119. package/nitrogen/generated/android/NitroMarkdownOnLoad.hpp +13 -4
  120. package/nitrogen/generated/android/c++/JHybridMarkdownSessionSpec.cpp +35 -32
  121. package/nitrogen/generated/android/c++/JHybridMarkdownSessionSpec.hpp +21 -22
  122. package/nitrogen/generated/android/kotlin/com/margelo/nitro/com/nitromarkdown/HybridMarkdownSessionSpec.kt +23 -18
  123. package/nitrogen/generated/ios/c++/HybridMarkdownSessionSpecSwift.hpp +14 -0
  124. package/nitrogen/generated/ios/swift/HybridMarkdownSessionSpec.swift +2 -0
  125. package/nitrogen/generated/ios/swift/HybridMarkdownSessionSpec_cxx.swift +23 -0
  126. package/nitrogen/generated/shared/c++/HybridMarkdownSessionSpec.cpp +2 -0
  127. package/nitrogen/generated/shared/c++/HybridMarkdownSessionSpec.hpp +2 -0
  128. package/package.json +6 -3
  129. package/react-native-nitro-markdown.podspec +1 -1
  130. package/src/MarkdownContext.ts +6 -0
  131. package/src/headless.ts +12 -0
  132. package/src/index.ts +3 -0
  133. package/src/markdown.tsx +47 -7
  134. package/src/renderers/code.tsx +27 -2
  135. package/src/renderers/table/cell-content.tsx +38 -0
  136. package/src/renderers/table/index.tsx +419 -0
  137. package/src/renderers/table/table-reducer.ts +36 -0
  138. package/src/renderers/table/table-utils.ts +81 -0
  139. package/src/renderers/table/types.ts +24 -0
  140. package/src/renderers/table.tsx +1 -547
  141. package/src/specs/MarkdownSession.nitro.ts +10 -0
  142. package/src/theme.ts +29 -1
  143. package/src/use-markdown-stream.ts +10 -0
  144. package/src/utils/code-highlight.ts +102 -0
package/src/theme.ts CHANGED
@@ -20,6 +20,16 @@ export type MarkdownTheme = {
20
20
  tableHeaderText: string | undefined;
21
21
  tableRowEven: string | undefined;
22
22
  tableRowOdd: string | undefined;
23
+ codeTokenColors?: {
24
+ keyword?: string;
25
+ string?: string;
26
+ comment?: string;
27
+ number?: string;
28
+ operator?: string;
29
+ punctuation?: string;
30
+ type?: string;
31
+ default?: string;
32
+ };
23
33
  };
24
34
  spacing: {
25
35
  xs: number;
@@ -74,6 +84,15 @@ export const defaultMarkdownTheme: MarkdownTheme = {
74
84
  tableHeaderText: "#64748b",
75
85
  tableRowEven: "transparent",
76
86
  tableRowOdd: "#f8fafc",
87
+ codeTokenColors: {
88
+ keyword: '#c792ea',
89
+ string: '#c3e88d',
90
+ comment: '#546e7a',
91
+ number: '#f78c6c',
92
+ operator: '#89ddff',
93
+ punctuation: '#89ddff',
94
+ type: '#ffcb6b',
95
+ },
77
96
  },
78
97
  spacing: {
79
98
  xs: 4,
@@ -129,8 +148,17 @@ export type PartialMarkdownTheme = {
129
148
  : MarkdownTheme[K];
130
149
  };
131
150
 
151
+ type TextNodeType =
152
+ | "text" | "bold" | "italic" | "strikethrough" | "link"
153
+ | "code_inline" | "heading" | "paragraph" | "math_inline" | "html_inline";
154
+ type ViewNodeType =
155
+ | "document" | "blockquote" | "code_block" | "horizontal_rule"
156
+ | "image" | "list" | "list_item" | "task_list_item" | "table"
157
+ | "table_head" | "table_body" | "table_row" | "table_cell"
158
+ | "math_block" | "html_block" | "line_break" | "soft_break";
159
+
132
160
  export type NodeStyleOverrides = Partial<
133
- Record<MarkdownNode["type"], ViewStyle | TextStyle>
161
+ { [K in TextNodeType]: TextStyle } & { [K in ViewNodeType]: ViewStyle }
134
162
  >;
135
163
 
136
164
  export type StylingStrategy = "opinionated" | "minimal";
@@ -39,6 +39,14 @@ export function useMarkdownSession() {
39
39
 
40
40
  const getSession = useCallback(() => sessionRef.current!, []);
41
41
 
42
+ const reset = useCallback((text: string) => {
43
+ sessionRef.current!.reset(text);
44
+ }, []);
45
+
46
+ const replace = useCallback((from: number, to: number, text: string) => {
47
+ return sessionRef.current!.replace(from, to, text);
48
+ }, []);
49
+
42
50
  return {
43
51
  getSession,
44
52
  isStreaming,
@@ -46,6 +54,8 @@ export function useMarkdownSession() {
46
54
  stop,
47
55
  clear,
48
56
  setHighlight,
57
+ reset,
58
+ replace,
49
59
  };
50
60
  }
51
61
 
@@ -0,0 +1,102 @@
1
+ export type TokenType =
2
+ | 'keyword'
3
+ | 'string'
4
+ | 'comment'
5
+ | 'number'
6
+ | 'operator'
7
+ | 'punctuation'
8
+ | 'type'
9
+ | 'default';
10
+
11
+ export type HighlightedToken = { text: string; type: TokenType };
12
+ export type CodeHighlighter = (language: string, code: string) => HighlightedToken[];
13
+
14
+ const JS_KEYWORDS = new Set([
15
+ 'const', 'let', 'var', 'function', 'return', 'if', 'else', 'for', 'while',
16
+ 'class', 'extends', 'import', 'export', 'from', 'default', 'new', 'this',
17
+ 'typeof', 'instanceof', 'null', 'undefined', 'true', 'false', 'async',
18
+ 'await', 'try', 'catch', 'throw', 'switch', 'case', 'break', 'continue',
19
+ 'type', 'interface', 'enum', 'as', 'in', 'of', 'void',
20
+ ]);
21
+
22
+ const PYTHON_KEYWORDS = new Set([
23
+ 'def', 'class', 'import', 'from', 'return', 'if', 'elif', 'else', 'for',
24
+ 'while', 'try', 'except', 'finally', 'with', 'as', 'pass', 'break',
25
+ 'continue', 'and', 'or', 'not', 'in', 'is', 'None', 'True', 'False',
26
+ 'lambda', 'yield', 'async', 'await',
27
+ ]);
28
+
29
+ const SHELL_KEYWORDS = new Set([
30
+ 'if', 'then', 'else', 'elif', 'fi', 'for', 'do', 'done', 'while',
31
+ 'case', 'esac', 'function', 'return', 'exit', 'echo', 'export',
32
+ ]);
33
+
34
+ function getKeywords(language: string): Set<string> {
35
+ const lang = language.toLowerCase();
36
+ if (lang === 'python' || lang === 'py') return PYTHON_KEYWORDS;
37
+ if (lang === 'bash' || lang === 'sh' || lang === 'shell' || lang === 'zsh') return SHELL_KEYWORDS;
38
+ return JS_KEYWORDS; // default for js/ts/jsx/tsx/java/c/cpp etc.
39
+ }
40
+
41
+ // Tokenize a single line into tokens
42
+ function tokenizeLine(line: string, language: string): HighlightedToken[] {
43
+ const keywords = getKeywords(language);
44
+ const tokens: HighlightedToken[] = [];
45
+
46
+ // Full-line comment detection
47
+ const trimmed = line.trimStart();
48
+ const lang = language.toLowerCase();
49
+ const isPythonLike = lang === 'python' || lang === 'py';
50
+ const isShellLike = lang === 'bash' || lang === 'sh' || lang === 'shell' || lang === 'zsh';
51
+
52
+ if (trimmed.startsWith('//') || trimmed.startsWith('#') && (isShellLike || isPythonLike)) {
53
+ return [{ text: line, type: 'comment' }];
54
+ }
55
+
56
+ // Simple token regex: strings, numbers, operators, identifiers, punctuation
57
+ const tokenRegex = /("(?:[^"\\]|\\.)*"|'(?:[^'\\]|\\.)*'|`(?:[^`\\]|\\.)*`)|(\b\d+(?:\.\d+)?\b)|(\/\/[^\n]*|#[^\n]*)|([a-zA-Z_$][a-zA-Z0-9_$]*)|([+\-*/%=<>!&|^~?:]+)|([()\[\]{},;.])|(\s+)|(.)/g;
58
+
59
+ let match: RegExpExecArray | null;
60
+ while ((match = tokenRegex.exec(line)) !== null) {
61
+ const [full, str, num, comment, ident, op, punct] = match;
62
+ if (str) {
63
+ tokens.push({ text: full, type: 'string' });
64
+ } else if (num) {
65
+ tokens.push({ text: full, type: 'number' });
66
+ } else if (comment) {
67
+ tokens.push({ text: full, type: 'comment' });
68
+ } else if (ident) {
69
+ const type: TokenType = keywords.has(ident)
70
+ ? 'keyword'
71
+ : /^[A-Z][A-Za-z0-9]*$/.test(ident)
72
+ ? 'type'
73
+ : 'default';
74
+ tokens.push({ text: full, type });
75
+ } else if (op) {
76
+ tokens.push({ text: full, type: 'operator' });
77
+ } else if (punct) {
78
+ tokens.push({ text: full, type: 'punctuation' });
79
+ } else {
80
+ tokens.push({ text: full, type: 'default' });
81
+ }
82
+ }
83
+
84
+ return tokens;
85
+ }
86
+
87
+ export function defaultHighlighter(language: string, code: string): HighlightedToken[] {
88
+ if (!language || language === 'text' || language === 'plain') {
89
+ return [{ text: code, type: 'default' }];
90
+ }
91
+
92
+ // Process line by line, re-inserting newlines as default tokens
93
+ const lines = code.split('\n');
94
+ const result: HighlightedToken[] = [];
95
+ for (let i = 0; i < lines.length; i++) {
96
+ result.push(...tokenizeLine(lines[i]!, language));
97
+ if (i < lines.length - 1) {
98
+ result.push({ text: '\n', type: 'default' });
99
+ }
100
+ }
101
+ return result;
102
+ }