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.
- package/README.md +68 -5
- package/android/src/main/cpp/cpp-adapter.cpp +4 -1
- package/android/src/main/java/com/margelo/nitro/com/nitromarkdown/HybridMarkdownSession.kt +19 -0
- package/android/src/main/java/com/nitromarkdown/NitroMarkdownPackage.kt +4 -3
- package/ios/HybridMarkdownSession.swift +18 -0
- package/lib/commonjs/MarkdownContext.js.map +1 -1
- package/lib/commonjs/headless.js +20 -0
- package/lib/commonjs/headless.js.map +1 -1
- package/lib/commonjs/index.js +9 -1
- package/lib/commonjs/index.js.map +1 -1
- package/lib/commonjs/markdown.js +21 -11
- package/lib/commonjs/markdown.js.map +1 -1
- package/lib/commonjs/renderers/code.js +20 -2
- package/lib/commonjs/renderers/code.js.map +1 -1
- package/lib/commonjs/renderers/table/cell-content.js +32 -0
- package/lib/commonjs/renderers/table/cell-content.js.map +1 -0
- package/lib/commonjs/renderers/table/index.js +310 -0
- package/lib/commonjs/renderers/table/index.js.map +1 -0
- package/lib/commonjs/renderers/table/table-reducer.js +29 -0
- package/lib/commonjs/renderers/table/table-reducer.js.map +1 -0
- package/lib/commonjs/renderers/table/table-utils.js +68 -0
- package/lib/commonjs/renderers/table/table-utils.js.map +1 -0
- package/lib/commonjs/renderers/table/types.js +6 -0
- package/lib/commonjs/renderers/table/types.js.map +1 -0
- package/lib/commonjs/renderers/table.js +6 -398
- package/lib/commonjs/renderers/table.js.map +1 -1
- package/lib/commonjs/theme.js +10 -1
- package/lib/commonjs/theme.js.map +1 -1
- package/lib/commonjs/use-markdown-stream.js +9 -1
- package/lib/commonjs/use-markdown-stream.js.map +1 -1
- package/lib/commonjs/utils/code-highlight.js +101 -0
- package/lib/commonjs/utils/code-highlight.js.map +1 -0
- package/lib/module/MarkdownContext.js.map +1 -1
- package/lib/module/headless.js +19 -0
- package/lib/module/headless.js.map +1 -1
- package/lib/module/index.js +1 -0
- package/lib/module/index.js.map +1 -1
- package/lib/module/markdown.js +21 -11
- package/lib/module/markdown.js.map +1 -1
- package/lib/module/renderers/code.js +20 -2
- package/lib/module/renderers/code.js.map +1 -1
- package/lib/module/renderers/table/cell-content.js +27 -0
- package/lib/module/renderers/table/cell-content.js.map +1 -0
- package/lib/module/renderers/table/index.js +305 -0
- package/lib/module/renderers/table/index.js.map +1 -0
- package/lib/module/renderers/table/table-reducer.js +24 -0
- package/lib/module/renderers/table/table-reducer.js.map +1 -0
- package/lib/module/renderers/table/table-utils.js +62 -0
- package/lib/module/renderers/table/table-utils.js.map +1 -0
- package/lib/module/renderers/table/types.js +4 -0
- package/lib/module/renderers/table/types.js.map +1 -0
- package/lib/module/renderers/table.js +1 -397
- package/lib/module/renderers/table.js.map +1 -1
- package/lib/module/theme.js +10 -1
- package/lib/module/theme.js.map +1 -1
- package/lib/module/use-markdown-stream.js +9 -1
- package/lib/module/use-markdown-stream.js.map +1 -1
- package/lib/module/utils/code-highlight.js +97 -0
- package/lib/module/utils/code-highlight.js.map +1 -0
- package/lib/typescript/commonjs/MarkdownContext.d.ts +6 -0
- package/lib/typescript/commonjs/MarkdownContext.d.ts.map +1 -1
- package/lib/typescript/commonjs/headless.d.ts +5 -0
- package/lib/typescript/commonjs/headless.d.ts.map +1 -1
- package/lib/typescript/commonjs/index.d.ts +2 -0
- package/lib/typescript/commonjs/index.d.ts.map +1 -1
- package/lib/typescript/commonjs/markdown.d.ts +24 -0
- package/lib/typescript/commonjs/markdown.d.ts.map +1 -1
- package/lib/typescript/commonjs/renderers/code.d.ts.map +1 -1
- package/lib/typescript/commonjs/renderers/table/cell-content.d.ts +15 -0
- package/lib/typescript/commonjs/renderers/table/cell-content.d.ts.map +1 -0
- package/lib/typescript/commonjs/renderers/table/index.d.ts +11 -0
- package/lib/typescript/commonjs/renderers/table/index.d.ts.map +1 -0
- package/lib/typescript/commonjs/renderers/table/table-reducer.d.ts +5 -0
- package/lib/typescript/commonjs/renderers/table/table-reducer.d.ts.map +1 -0
- package/lib/typescript/commonjs/renderers/table/table-utils.d.ts +10 -0
- package/lib/typescript/commonjs/renderers/table/table-utils.d.ts.map +1 -0
- package/lib/typescript/commonjs/renderers/table/types.d.ts +24 -0
- package/lib/typescript/commonjs/renderers/table/types.d.ts.map +1 -0
- package/lib/typescript/commonjs/renderers/table.d.ts +1 -11
- package/lib/typescript/commonjs/renderers/table.d.ts.map +1 -1
- package/lib/typescript/commonjs/specs/MarkdownSession.nitro.d.ts +9 -0
- package/lib/typescript/commonjs/specs/MarkdownSession.nitro.d.ts.map +1 -1
- package/lib/typescript/commonjs/theme.d.ts +18 -2
- package/lib/typescript/commonjs/theme.d.ts.map +1 -1
- package/lib/typescript/commonjs/use-markdown-stream.d.ts +4 -0
- package/lib/typescript/commonjs/use-markdown-stream.d.ts.map +1 -1
- package/lib/typescript/commonjs/utils/code-highlight.d.ts +8 -0
- package/lib/typescript/commonjs/utils/code-highlight.d.ts.map +1 -0
- package/lib/typescript/module/MarkdownContext.d.ts +6 -0
- package/lib/typescript/module/MarkdownContext.d.ts.map +1 -1
- package/lib/typescript/module/headless.d.ts +5 -0
- package/lib/typescript/module/headless.d.ts.map +1 -1
- package/lib/typescript/module/index.d.ts +2 -0
- package/lib/typescript/module/index.d.ts.map +1 -1
- package/lib/typescript/module/markdown.d.ts +24 -0
- package/lib/typescript/module/markdown.d.ts.map +1 -1
- package/lib/typescript/module/renderers/code.d.ts.map +1 -1
- package/lib/typescript/module/renderers/table/cell-content.d.ts +15 -0
- package/lib/typescript/module/renderers/table/cell-content.d.ts.map +1 -0
- package/lib/typescript/module/renderers/table/index.d.ts +11 -0
- package/lib/typescript/module/renderers/table/index.d.ts.map +1 -0
- package/lib/typescript/module/renderers/table/table-reducer.d.ts +5 -0
- package/lib/typescript/module/renderers/table/table-reducer.d.ts.map +1 -0
- package/lib/typescript/module/renderers/table/table-utils.d.ts +10 -0
- package/lib/typescript/module/renderers/table/table-utils.d.ts.map +1 -0
- package/lib/typescript/module/renderers/table/types.d.ts +24 -0
- package/lib/typescript/module/renderers/table/types.d.ts.map +1 -0
- package/lib/typescript/module/renderers/table.d.ts +1 -11
- package/lib/typescript/module/renderers/table.d.ts.map +1 -1
- package/lib/typescript/module/specs/MarkdownSession.nitro.d.ts +9 -0
- package/lib/typescript/module/specs/MarkdownSession.nitro.d.ts.map +1 -1
- package/lib/typescript/module/theme.d.ts +18 -2
- package/lib/typescript/module/theme.d.ts.map +1 -1
- package/lib/typescript/module/use-markdown-stream.d.ts +4 -0
- package/lib/typescript/module/use-markdown-stream.d.ts.map +1 -1
- package/lib/typescript/module/utils/code-highlight.d.ts +8 -0
- package/lib/typescript/module/utils/code-highlight.d.ts.map +1 -0
- package/nitrogen/generated/android/NitroMarkdownOnLoad.cpp +37 -27
- package/nitrogen/generated/android/NitroMarkdownOnLoad.hpp +13 -4
- package/nitrogen/generated/android/c++/JHybridMarkdownSessionSpec.cpp +35 -32
- package/nitrogen/generated/android/c++/JHybridMarkdownSessionSpec.hpp +21 -22
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/com/nitromarkdown/HybridMarkdownSessionSpec.kt +23 -18
- package/nitrogen/generated/ios/c++/HybridMarkdownSessionSpecSwift.hpp +14 -0
- package/nitrogen/generated/ios/swift/HybridMarkdownSessionSpec.swift +2 -0
- package/nitrogen/generated/ios/swift/HybridMarkdownSessionSpec_cxx.swift +23 -0
- package/nitrogen/generated/shared/c++/HybridMarkdownSessionSpec.cpp +2 -0
- package/nitrogen/generated/shared/c++/HybridMarkdownSessionSpec.hpp +2 -0
- package/package.json +6 -3
- package/react-native-nitro-markdown.podspec +1 -1
- package/src/MarkdownContext.ts +6 -0
- package/src/headless.ts +12 -0
- package/src/index.ts +3 -0
- package/src/markdown.tsx +47 -7
- package/src/renderers/code.tsx +27 -2
- package/src/renderers/table/cell-content.tsx +38 -0
- package/src/renderers/table/index.tsx +419 -0
- package/src/renderers/table/table-reducer.ts +36 -0
- package/src/renderers/table/table-utils.ts +81 -0
- package/src/renderers/table/types.ts +24 -0
- package/src/renderers/table.tsx +1 -547
- package/src/specs/MarkdownSession.nitro.ts +10 -0
- package/src/theme.ts +29 -1
- package/src/use-markdown-stream.ts +10 -0
- 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
|
-
|
|
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
|
+
}
|