react-native-nitro-markdown 0.5.2 → 0.5.4

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 (178) hide show
  1. package/README.md +311 -669
  2. package/android/CMakeLists.txt +8 -1
  3. package/android/build.gradle +9 -2
  4. package/android/consumer-rules.pro +31 -0
  5. package/android/gradle.properties +2 -0
  6. package/android/src/main/java/com/margelo/nitro/com/nitromarkdown/HybridMarkdownSession.kt +68 -22
  7. package/android/src/main/java/com/nitromarkdown/NitroMarkdownPackage.kt +6 -18
  8. package/cpp/bindings/HybridMarkdownParser.cpp +40 -12
  9. package/cpp/bindings/HybridMarkdownParser.hpp +4 -4
  10. package/cpp/bindings/HybridMarkdownSession.cpp +2 -0
  11. package/cpp/core/MD4CParser.cpp +147 -86
  12. package/cpp/core/MarkdownSessionCore.cpp +2 -0
  13. package/cpp/core/MarkdownTypes.hpp +1 -1
  14. package/ios/HybridMarkdownSession.swift +89 -46
  15. package/lib/commonjs/headless.js +34 -8
  16. package/lib/commonjs/headless.js.map +1 -1
  17. package/lib/commonjs/index.js +48 -38
  18. package/lib/commonjs/index.js.map +1 -1
  19. package/lib/commonjs/markdown-stream.js +1 -1
  20. package/lib/commonjs/markdown-stream.js.map +1 -1
  21. package/lib/commonjs/markdown.js +57 -16
  22. package/lib/commonjs/markdown.js.map +1 -1
  23. package/lib/commonjs/renderers/blockquote.js +15 -13
  24. package/lib/commonjs/renderers/blockquote.js.map +1 -1
  25. package/lib/commonjs/renderers/code.js +58 -54
  26. package/lib/commonjs/renderers/code.js.map +1 -1
  27. package/lib/commonjs/renderers/heading.js +48 -46
  28. package/lib/commonjs/renderers/heading.js.map +1 -1
  29. package/lib/commonjs/renderers/horizontal-rule.js +10 -8
  30. package/lib/commonjs/renderers/horizontal-rule.js.map +1 -1
  31. package/lib/commonjs/renderers/image.js +18 -4
  32. package/lib/commonjs/renderers/image.js.map +1 -1
  33. package/lib/commonjs/renderers/link.js +7 -2
  34. package/lib/commonjs/renderers/link.js.map +1 -1
  35. package/lib/commonjs/renderers/list.js +75 -68
  36. package/lib/commonjs/renderers/list.js.map +1 -1
  37. package/lib/commonjs/renderers/math.js +8 -5
  38. package/lib/commonjs/renderers/math.js.map +1 -1
  39. package/lib/commonjs/renderers/paragraph.js +15 -13
  40. package/lib/commonjs/renderers/paragraph.js.map +1 -1
  41. package/lib/commonjs/renderers/style-cache.js +14 -0
  42. package/lib/commonjs/renderers/style-cache.js.map +1 -0
  43. package/lib/commonjs/renderers/table/cell-content.js +1 -1
  44. package/lib/commonjs/renderers/table/cell-content.js.map +1 -1
  45. package/lib/commonjs/renderers/table/index.js +17 -6
  46. package/lib/commonjs/renderers/table/index.js.map +1 -1
  47. package/lib/commonjs/theme.js +7 -7
  48. package/lib/commonjs/theme.js.map +1 -1
  49. package/lib/commonjs/utils/code-highlight.js +24 -25
  50. package/lib/commonjs/utils/code-highlight.js.map +1 -1
  51. package/lib/module/headless.js +35 -7
  52. package/lib/module/headless.js.map +1 -1
  53. package/lib/module/index.js +1 -1
  54. package/lib/module/index.js.map +1 -1
  55. package/lib/module/markdown-stream.js +1 -1
  56. package/lib/module/markdown-stream.js.map +1 -1
  57. package/lib/module/markdown.js +58 -17
  58. package/lib/module/markdown.js.map +1 -1
  59. package/lib/module/renderers/blockquote.js +15 -13
  60. package/lib/module/renderers/blockquote.js.map +1 -1
  61. package/lib/module/renderers/code.js +58 -54
  62. package/lib/module/renderers/code.js.map +1 -1
  63. package/lib/module/renderers/heading.js +48 -46
  64. package/lib/module/renderers/heading.js.map +1 -1
  65. package/lib/module/renderers/horizontal-rule.js +10 -8
  66. package/lib/module/renderers/horizontal-rule.js.map +1 -1
  67. package/lib/module/renderers/image.js +19 -5
  68. package/lib/module/renderers/image.js.map +1 -1
  69. package/lib/module/renderers/link.js +7 -2
  70. package/lib/module/renderers/link.js.map +1 -1
  71. package/lib/module/renderers/list.js +75 -68
  72. package/lib/module/renderers/list.js.map +1 -1
  73. package/lib/module/renderers/math.js +8 -5
  74. package/lib/module/renderers/math.js.map +1 -1
  75. package/lib/module/renderers/paragraph.js +15 -13
  76. package/lib/module/renderers/paragraph.js.map +1 -1
  77. package/lib/module/renderers/style-cache.js +10 -0
  78. package/lib/module/renderers/style-cache.js.map +1 -0
  79. package/lib/module/renderers/table/cell-content.js +1 -1
  80. package/lib/module/renderers/table/cell-content.js.map +1 -1
  81. package/lib/module/renderers/table/index.js +17 -6
  82. package/lib/module/renderers/table/index.js.map +1 -1
  83. package/lib/module/theme.js +7 -7
  84. package/lib/module/theme.js.map +1 -1
  85. package/lib/module/utils/code-highlight.js +24 -25
  86. package/lib/module/utils/code-highlight.js.map +1 -1
  87. package/lib/typescript/commonjs/Markdown.nitro.d.ts +1 -0
  88. package/lib/typescript/commonjs/Markdown.nitro.d.ts.map +1 -1
  89. package/lib/typescript/commonjs/headless.d.ts +10 -2
  90. package/lib/typescript/commonjs/headless.d.ts.map +1 -1
  91. package/lib/typescript/commonjs/index.d.ts +3 -2
  92. package/lib/typescript/commonjs/index.d.ts.map +1 -1
  93. package/lib/typescript/commonjs/markdown-stream.d.ts.map +1 -1
  94. package/lib/typescript/commonjs/markdown.d.ts +8 -3
  95. package/lib/typescript/commonjs/markdown.d.ts.map +1 -1
  96. package/lib/typescript/commonjs/renderers/blockquote.d.ts +1 -1
  97. package/lib/typescript/commonjs/renderers/blockquote.d.ts.map +1 -1
  98. package/lib/typescript/commonjs/renderers/code.d.ts.map +1 -1
  99. package/lib/typescript/commonjs/renderers/heading.d.ts +1 -1
  100. package/lib/typescript/commonjs/renderers/heading.d.ts.map +1 -1
  101. package/lib/typescript/commonjs/renderers/horizontal-rule.d.ts +1 -1
  102. package/lib/typescript/commonjs/renderers/horizontal-rule.d.ts.map +1 -1
  103. package/lib/typescript/commonjs/renderers/image.d.ts.map +1 -1
  104. package/lib/typescript/commonjs/renderers/link.d.ts.map +1 -1
  105. package/lib/typescript/commonjs/renderers/list.d.ts +1 -1
  106. package/lib/typescript/commonjs/renderers/list.d.ts.map +1 -1
  107. package/lib/typescript/commonjs/renderers/math.d.ts +1 -1
  108. package/lib/typescript/commonjs/renderers/math.d.ts.map +1 -1
  109. package/lib/typescript/commonjs/renderers/paragraph.d.ts +1 -1
  110. package/lib/typescript/commonjs/renderers/paragraph.d.ts.map +1 -1
  111. package/lib/typescript/commonjs/renderers/style-cache.d.ts +3 -0
  112. package/lib/typescript/commonjs/renderers/style-cache.d.ts.map +1 -0
  113. package/lib/typescript/commonjs/renderers/table/cell-content.d.ts +4 -3
  114. package/lib/typescript/commonjs/renderers/table/cell-content.d.ts.map +1 -1
  115. package/lib/typescript/commonjs/renderers/table/index.d.ts.map +1 -1
  116. package/lib/typescript/commonjs/theme.d.ts.map +1 -1
  117. package/lib/typescript/commonjs/utils/code-highlight.d.ts +1 -1
  118. package/lib/typescript/commonjs/utils/code-highlight.d.ts.map +1 -1
  119. package/lib/typescript/module/Markdown.nitro.d.ts +1 -0
  120. package/lib/typescript/module/Markdown.nitro.d.ts.map +1 -1
  121. package/lib/typescript/module/headless.d.ts +10 -2
  122. package/lib/typescript/module/headless.d.ts.map +1 -1
  123. package/lib/typescript/module/index.d.ts +3 -2
  124. package/lib/typescript/module/index.d.ts.map +1 -1
  125. package/lib/typescript/module/markdown-stream.d.ts.map +1 -1
  126. package/lib/typescript/module/markdown.d.ts +8 -3
  127. package/lib/typescript/module/markdown.d.ts.map +1 -1
  128. package/lib/typescript/module/renderers/blockquote.d.ts +1 -1
  129. package/lib/typescript/module/renderers/blockquote.d.ts.map +1 -1
  130. package/lib/typescript/module/renderers/code.d.ts.map +1 -1
  131. package/lib/typescript/module/renderers/heading.d.ts +1 -1
  132. package/lib/typescript/module/renderers/heading.d.ts.map +1 -1
  133. package/lib/typescript/module/renderers/horizontal-rule.d.ts +1 -1
  134. package/lib/typescript/module/renderers/horizontal-rule.d.ts.map +1 -1
  135. package/lib/typescript/module/renderers/image.d.ts.map +1 -1
  136. package/lib/typescript/module/renderers/link.d.ts.map +1 -1
  137. package/lib/typescript/module/renderers/list.d.ts +1 -1
  138. package/lib/typescript/module/renderers/list.d.ts.map +1 -1
  139. package/lib/typescript/module/renderers/math.d.ts +1 -1
  140. package/lib/typescript/module/renderers/math.d.ts.map +1 -1
  141. package/lib/typescript/module/renderers/paragraph.d.ts +1 -1
  142. package/lib/typescript/module/renderers/paragraph.d.ts.map +1 -1
  143. package/lib/typescript/module/renderers/style-cache.d.ts +3 -0
  144. package/lib/typescript/module/renderers/style-cache.d.ts.map +1 -0
  145. package/lib/typescript/module/renderers/table/cell-content.d.ts +4 -3
  146. package/lib/typescript/module/renderers/table/cell-content.d.ts.map +1 -1
  147. package/lib/typescript/module/renderers/table/index.d.ts.map +1 -1
  148. package/lib/typescript/module/theme.d.ts.map +1 -1
  149. package/lib/typescript/module/utils/code-highlight.d.ts +1 -1
  150. package/lib/typescript/module/utils/code-highlight.d.ts.map +1 -1
  151. package/nitro.json +12 -3
  152. package/nitrogen/generated/android/NitroMarkdownOnLoad.cpp +2 -2
  153. package/nitrogen/generated/android/c++/JFunc_void.hpp +2 -2
  154. package/nitrogen/generated/android/c++/JFunc_void_double_double.hpp +2 -2
  155. package/nitrogen/generated/android/c++/JHybridMarkdownSessionSpec.hpp +2 -2
  156. package/nitrogen/generated/ios/NitroMarkdown+autolinking.rb +2 -0
  157. package/nitrogen/generated/shared/c++/ParserOptions.hpp +6 -2
  158. package/package.json +8 -6
  159. package/react-native-nitro-markdown.podspec +3 -0
  160. package/src/Markdown.nitro.ts +1 -0
  161. package/src/headless.ts +58 -8
  162. package/src/index.ts +16 -2
  163. package/src/markdown-stream.tsx +1 -0
  164. package/src/markdown.tsx +108 -23
  165. package/src/renderers/blockquote.tsx +22 -17
  166. package/src/renderers/code.tsx +76 -57
  167. package/src/renderers/heading.tsx +60 -54
  168. package/src/renderers/horizontal-rule.tsx +17 -12
  169. package/src/renderers/image.tsx +24 -5
  170. package/src/renderers/link.tsx +8 -2
  171. package/src/renderers/list.tsx +93 -74
  172. package/src/renderers/math.tsx +14 -5
  173. package/src/renderers/paragraph.tsx +22 -17
  174. package/src/renderers/style-cache.ts +14 -0
  175. package/src/renderers/table/cell-content.tsx +15 -4
  176. package/src/renderers/table/index.tsx +30 -13
  177. package/src/theme.ts +34 -14
  178. package/src/utils/code-highlight.ts +133 -44
@@ -1,44 +1,121 @@
1
1
  export type TokenType =
2
- | 'keyword'
3
- | 'string'
4
- | 'comment'
5
- | 'number'
6
- | 'operator'
7
- | 'punctuation'
8
- | 'type'
9
- | 'default';
2
+ | "keyword"
3
+ | "string"
4
+ | "comment"
5
+ | "number"
6
+ | "operator"
7
+ | "punctuation"
8
+ | "type"
9
+ | "default";
10
10
 
11
11
  export type HighlightedToken = { text: string; type: TokenType };
12
- export type CodeHighlighter = (language: string, code: string) => HighlightedToken[];
12
+ export type CodeHighlighter = (
13
+ language: string,
14
+ code: string,
15
+ ) => HighlightedToken[];
13
16
 
14
17
  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',
18
+ "const",
19
+ "let",
20
+ "var",
21
+ "function",
22
+ "return",
23
+ "if",
24
+ "else",
25
+ "for",
26
+ "while",
27
+ "class",
28
+ "extends",
29
+ "import",
30
+ "export",
31
+ "from",
32
+ "default",
33
+ "new",
34
+ "this",
35
+ "typeof",
36
+ "instanceof",
37
+ "null",
38
+ "undefined",
39
+ "true",
40
+ "false",
41
+ "async",
42
+ "await",
43
+ "try",
44
+ "catch",
45
+ "throw",
46
+ "switch",
47
+ "case",
48
+ "break",
49
+ "continue",
50
+ "type",
51
+ "interface",
52
+ "enum",
53
+ "as",
54
+ "in",
55
+ "of",
56
+ "void",
20
57
  ]);
21
58
 
22
59
  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',
60
+ "def",
61
+ "class",
62
+ "import",
63
+ "from",
64
+ "return",
65
+ "if",
66
+ "elif",
67
+ "else",
68
+ "for",
69
+ "while",
70
+ "try",
71
+ "except",
72
+ "finally",
73
+ "with",
74
+ "as",
75
+ "pass",
76
+ "break",
77
+ "continue",
78
+ "and",
79
+ "or",
80
+ "not",
81
+ "in",
82
+ "is",
83
+ "None",
84
+ "True",
85
+ "False",
86
+ "lambda",
87
+ "yield",
88
+ "async",
89
+ "await",
27
90
  ]);
28
91
 
29
92
  const SHELL_KEYWORDS = new Set([
30
- 'if', 'then', 'else', 'elif', 'fi', 'for', 'do', 'done', 'while',
31
- 'case', 'esac', 'function', 'return', 'exit', 'echo', 'export',
93
+ "if",
94
+ "then",
95
+ "else",
96
+ "elif",
97
+ "fi",
98
+ "for",
99
+ "do",
100
+ "done",
101
+ "while",
102
+ "case",
103
+ "esac",
104
+ "function",
105
+ "return",
106
+ "exit",
107
+ "echo",
108
+ "export",
32
109
  ]);
33
110
 
34
111
  function getKeywords(language: string): Set<string> {
35
112
  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;
113
+ if (lang === "python" || lang === "py") return PYTHON_KEYWORDS;
114
+ if (lang === "bash" || lang === "sh" || lang === "shell" || lang === "zsh")
115
+ return SHELL_KEYWORDS;
38
116
  return JS_KEYWORDS; // default for js/ts/jsx/tsx/java/c/cpp etc.
39
117
  }
40
118
 
41
- // Tokenize a single line into tokens
42
119
  function tokenizeLine(line: string, language: string): HighlightedToken[] {
43
120
  const keywords = getKeywords(language);
44
121
  const tokens: HighlightedToken[] = [];
@@ -46,56 +123,68 @@ function tokenizeLine(line: string, language: string): HighlightedToken[] {
46
123
  // Full-line comment detection
47
124
  const trimmed = line.trimStart();
48
125
  const lang = language.toLowerCase();
49
- const isPythonLike = lang === 'python' || lang === 'py';
50
- const isShellLike = lang === 'bash' || lang === 'sh' || lang === 'shell' || lang === 'zsh';
126
+ const isPythonLike = lang === "python" || lang === "py";
127
+ const isShellLike =
128
+ lang === "bash" || lang === "sh" || lang === "shell" || lang === "zsh";
51
129
 
52
- if (trimmed.startsWith('//') || trimmed.startsWith('#') && (isShellLike || isPythonLike)) {
53
- return [{ text: line, type: 'comment' }];
130
+ if (
131
+ trimmed.startsWith("//") ||
132
+ (trimmed.startsWith("#") && (isShellLike || isPythonLike))
133
+ ) {
134
+ return [{ text: line, type: "comment" }];
54
135
  }
55
136
 
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;
137
+ // Only include # as comment for shell/python languages
138
+ const commentPattern =
139
+ isShellLike || isPythonLike ? "\/\/[^\\n]*|#[^\\n]*" : "\/\/[^\\n]*";
140
+ const tokenRegex = new RegExp(
141
+ `("(?:[^"\\\\]|\\\\.)*"|'(?:[^'\\\\]|\\\\.)*'|\`(?:[^\`\\\\]|\\\\.)*\`)|(\\b\\d+(?:\\.\\d+)?\\b)|(${commentPattern})|([a-zA-Z_$][a-zA-Z0-9_$]*)|([+\\-*/%=<>!&|^~?:]+)|([(\\)\\[\\]{},;.])|(\\s+)|(.)`,
142
+ "g",
143
+ );
58
144
 
59
145
  let match: RegExpExecArray | null;
60
146
  while ((match = tokenRegex.exec(line)) !== null) {
61
147
  const [full, str, num, comment, ident, op, punct] = match;
62
148
  if (str) {
63
- tokens.push({ text: full, type: 'string' });
149
+ tokens.push({ text: full, type: "string" });
64
150
  } else if (num) {
65
- tokens.push({ text: full, type: 'number' });
151
+ tokens.push({ text: full, type: "number" });
66
152
  } else if (comment) {
67
- tokens.push({ text: full, type: 'comment' });
153
+ tokens.push({ text: full, type: "comment" });
68
154
  } else if (ident) {
69
155
  const type: TokenType = keywords.has(ident)
70
- ? 'keyword'
156
+ ? "keyword"
71
157
  : /^[A-Z][A-Za-z0-9]*$/.test(ident)
72
- ? 'type'
73
- : 'default';
158
+ ? "type"
159
+ : "default";
74
160
  tokens.push({ text: full, type });
75
161
  } else if (op) {
76
- tokens.push({ text: full, type: 'operator' });
162
+ tokens.push({ text: full, type: "operator" });
77
163
  } else if (punct) {
78
- tokens.push({ text: full, type: 'punctuation' });
164
+ tokens.push({ text: full, type: "punctuation" });
79
165
  } else {
80
- tokens.push({ text: full, type: 'default' });
166
+ tokens.push({ text: full, type: "default" });
81
167
  }
82
168
  }
83
169
 
84
170
  return tokens;
85
171
  }
86
172
 
87
- export function defaultHighlighter(language: string, code: string): HighlightedToken[] {
88
- if (!language || language === 'text' || language === 'plain') {
89
- return [{ text: code, type: 'default' }];
173
+ export function defaultHighlighter(
174
+ language: string,
175
+ code: string,
176
+ ): HighlightedToken[] {
177
+ if (!language || language === "text" || language === "plain") {
178
+ return [{ text: code, type: "default" }];
90
179
  }
91
180
 
92
181
  // Process line by line, re-inserting newlines as default tokens
93
- const lines = code.split('\n');
182
+ const lines = code.split("\n");
94
183
  const result: HighlightedToken[] = [];
95
184
  for (let i = 0; i < lines.length; i++) {
96
- result.push(...tokenizeLine(lines[i]!, language));
185
+ result.push(...tokenizeLine(lines[i], language));
97
186
  if (i < lines.length - 1) {
98
- result.push({ text: '\n', type: 'default' });
187
+ result.push({ text: "\n", type: "default" });
99
188
  }
100
189
  }
101
190
  return result;