react-ai-renderer 0.1.4 → 0.1.5
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 +65 -203
- package/dist/index.cjs +39422 -0
- package/dist/index.cjs.map +1 -0
- package/dist/index.js +39392 -15
- package/dist/index.js.map +1 -0
- package/package.json +12 -7
- package/dist/MermaidRenderer-62cbf217.js +0 -171
- package/dist/MermaidRenderer-680adac3.js +0 -169
- package/dist/index-543584d8.js +0 -1398
- package/dist/index-58ab9759.js +0 -1424
- package/dist/index.es.js +0 -9
package/package.json
CHANGED
|
@@ -1,9 +1,9 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "react-ai-renderer",
|
|
3
|
-
"version": "0.1.
|
|
3
|
+
"version": "0.1.5",
|
|
4
4
|
"type": "module",
|
|
5
|
-
"main": "dist/index.
|
|
6
|
-
"module": "dist/index.
|
|
5
|
+
"main": "dist/index.cjs",
|
|
6
|
+
"module": "dist/index.js",
|
|
7
7
|
"types": "dist/index.d.ts",
|
|
8
8
|
"files": [
|
|
9
9
|
"dist",
|
|
@@ -36,27 +36,32 @@
|
|
|
36
36
|
"react-dom": "^18.2.0"
|
|
37
37
|
},
|
|
38
38
|
"optionalDependencies": {
|
|
39
|
-
"
|
|
40
|
-
"
|
|
39
|
+
"katex": "^0.16.0",
|
|
40
|
+
"mermaid": "^10.6.1"
|
|
41
41
|
},
|
|
42
42
|
"dependencies": {
|
|
43
43
|
"@mdx-js/mdx": "^3.0.0",
|
|
44
|
+
"react-syntax-highlighter": "^15.5.0",
|
|
44
45
|
"rehype-highlight": "7.0.2",
|
|
45
46
|
"rehype-katex": "7.0.1",
|
|
46
47
|
"rehype-raw": "^7.0.0",
|
|
47
48
|
"remark-breaks": "4.0.0",
|
|
48
49
|
"remark-gfm": "4.0.0",
|
|
49
|
-
"remark-
|
|
50
|
+
"remark-html": "16.0.1",
|
|
51
|
+
"remark-math": "6.0.0",
|
|
52
|
+
"remark-rehype": "^11.1.1"
|
|
50
53
|
},
|
|
51
54
|
"devDependencies": {
|
|
52
55
|
"@babel/core": "^7.28.3",
|
|
53
56
|
"@babel/preset-react": "^7.27.1",
|
|
54
57
|
"@rollup/plugin-babel": "^6.0.4",
|
|
55
58
|
"@rollup/plugin-commonjs": "^24.0.0",
|
|
59
|
+
"@rollup/plugin-json": "^6.1.0",
|
|
56
60
|
"@rollup/plugin-node-resolve": "^15.0.0",
|
|
57
61
|
"@rollup/plugin-typescript": "^11.0.0",
|
|
58
62
|
"@types/react": "^18.2.0",
|
|
59
63
|
"@types/react-dom": "^18.2.0",
|
|
64
|
+
"@types/react-syntax-highlighter": "^15.5.9",
|
|
60
65
|
"mermaid": "^10.6.1",
|
|
61
66
|
"react": "^18.2.0",
|
|
62
67
|
"react-dom": "^18.2.0",
|
|
@@ -66,4 +71,4 @@
|
|
|
66
71
|
"tslib": "^2.8.1",
|
|
67
72
|
"typescript": "4.9.5"
|
|
68
73
|
}
|
|
69
|
-
}
|
|
74
|
+
}
|
|
@@ -1,171 +0,0 @@
|
|
|
1
|
-
'use strict';
|
|
2
|
-
|
|
3
|
-
var index = require('./index-58ab9759.js');
|
|
4
|
-
var React = require('react');
|
|
5
|
-
var runtime = require('react/jsx-runtime');
|
|
6
|
-
require('remark-math');
|
|
7
|
-
require('remark-breaks');
|
|
8
|
-
require('remark-gfm');
|
|
9
|
-
require('@mdx-js/mdx');
|
|
10
|
-
require('rehype-katex');
|
|
11
|
-
require('rehype-highlight');
|
|
12
|
-
|
|
13
|
-
var mermaidPromise = null;
|
|
14
|
-
var getMermaid = function () {
|
|
15
|
-
if (mermaidPromise) {
|
|
16
|
-
return mermaidPromise;
|
|
17
|
-
}
|
|
18
|
-
mermaidPromise = import('mermaid').then(function (module) {
|
|
19
|
-
return module.default || module;
|
|
20
|
-
}).catch(function (error) {
|
|
21
|
-
console.warn('Mermaid is not available. Install it to enable chart rendering.');
|
|
22
|
-
return null;
|
|
23
|
-
});
|
|
24
|
-
return mermaidPromise;
|
|
25
|
-
};
|
|
26
|
-
// 全局缓存
|
|
27
|
-
var globalSvgCache = new Map();
|
|
28
|
-
function MermaidRenderer(_a) {
|
|
29
|
-
var _this = this;
|
|
30
|
-
var chart = _a.chart,
|
|
31
|
-
index$1 = _a.index;
|
|
32
|
-
var ref = React.useRef(null);
|
|
33
|
-
var _b = index.__read(React.useState(false), 2),
|
|
34
|
-
ready = _b[0],
|
|
35
|
-
setReady = _b[1];
|
|
36
|
-
var _c = index.__read(React.useState(null), 2),
|
|
37
|
-
error = _c[0],
|
|
38
|
-
setError = _c[1];
|
|
39
|
-
var _d = index.__read(React.useState(null), 2),
|
|
40
|
-
mermaidAvailable = _d[0],
|
|
41
|
-
setMermaidAvailable = _d[1];
|
|
42
|
-
var chartId = React.useMemo(function () {
|
|
43
|
-
return "mermaid-".concat(index$1, "-").concat(Math.random().toString(36).substr(2, 9));
|
|
44
|
-
}, [index$1]);
|
|
45
|
-
var renderChart = React.useCallback(function () {
|
|
46
|
-
return index.__awaiter(_this, void 0, void 0, function () {
|
|
47
|
-
var mermaid, cachedSvg, isValid, svg, renderError_1, error_1;
|
|
48
|
-
return index.__generator(this, function (_a) {
|
|
49
|
-
switch (_a.label) {
|
|
50
|
-
case 0:
|
|
51
|
-
if (!chart || !ref.current) return [2 /*return*/];
|
|
52
|
-
_a.label = 1;
|
|
53
|
-
case 1:
|
|
54
|
-
_a.trys.push([1, 9,, 10]);
|
|
55
|
-
return [4 /*yield*/, getMermaid()];
|
|
56
|
-
case 2:
|
|
57
|
-
mermaid = _a.sent();
|
|
58
|
-
// 如果 mermaid 不可用,显示友好的提示信息
|
|
59
|
-
if (!mermaid) {
|
|
60
|
-
setMermaidAvailable(false);
|
|
61
|
-
return [2 /*return*/];
|
|
62
|
-
}
|
|
63
|
-
setMermaidAvailable(true);
|
|
64
|
-
cachedSvg = globalSvgCache.get(chart);
|
|
65
|
-
if (cachedSvg) {
|
|
66
|
-
ref.current.innerHTML = cachedSvg;
|
|
67
|
-
return [2 /*return*/];
|
|
68
|
-
}
|
|
69
|
-
if (!!mermaid.initialized) return [3 /*break*/, 4];
|
|
70
|
-
// 设置全局错误处理函数
|
|
71
|
-
mermaid.parseError = function (err) {
|
|
72
|
-
console.warn('Mermaid parse error:', err.message);
|
|
73
|
-
};
|
|
74
|
-
return [4 /*yield*/, mermaid.initialize({
|
|
75
|
-
startOnLoad: false,
|
|
76
|
-
theme: 'default',
|
|
77
|
-
securityLevel: 'loose',
|
|
78
|
-
themeVariables: {
|
|
79
|
-
primaryColor: '#2196f3'
|
|
80
|
-
},
|
|
81
|
-
logLevel: 1 // 减少日志输出
|
|
82
|
-
})];
|
|
83
|
-
case 3:
|
|
84
|
-
_a.sent();
|
|
85
|
-
_a.label = 4;
|
|
86
|
-
case 4:
|
|
87
|
-
_a.trys.push([4, 7,, 8]);
|
|
88
|
-
return [4 /*yield*/, mermaid.parse(chart.trim(), {
|
|
89
|
-
suppressErrors: true
|
|
90
|
-
})];
|
|
91
|
-
case 5:
|
|
92
|
-
isValid = _a.sent();
|
|
93
|
-
if (!isValid) {
|
|
94
|
-
throw new Error('Invalid mermaid syntax');
|
|
95
|
-
}
|
|
96
|
-
return [4 /*yield*/, mermaid.render(chartId, chart.trim())];
|
|
97
|
-
case 6:
|
|
98
|
-
svg = _a.sent().svg;
|
|
99
|
-
if (ref.current) {
|
|
100
|
-
ref.current.innerHTML = svg;
|
|
101
|
-
// 更新全局缓存
|
|
102
|
-
globalSvgCache.set(chart, svg);
|
|
103
|
-
}
|
|
104
|
-
setError(null);
|
|
105
|
-
return [3 /*break*/, 8];
|
|
106
|
-
case 7:
|
|
107
|
-
renderError_1 = _a.sent();
|
|
108
|
-
// 忽略渲染错误,设置错误状态但不抛出异常
|
|
109
|
-
setError(renderError_1 instanceof Error ? renderError_1.message : 'Failed to render chart');
|
|
110
|
-
// 清空容器内容以避免显示旧内容
|
|
111
|
-
if (ref.current) {
|
|
112
|
-
ref.current.innerHTML = '';
|
|
113
|
-
}
|
|
114
|
-
return [3 /*break*/, 8];
|
|
115
|
-
case 8:
|
|
116
|
-
return [3 /*break*/, 10];
|
|
117
|
-
case 9:
|
|
118
|
-
error_1 = _a.sent();
|
|
119
|
-
// 处理初始化或其他错误
|
|
120
|
-
console.error('Mermaid initialization failed:', error_1);
|
|
121
|
-
setError(error_1 instanceof Error ? error_1.message : 'Failed to render chart');
|
|
122
|
-
if (ref.current) {
|
|
123
|
-
ref.current.innerHTML = '';
|
|
124
|
-
}
|
|
125
|
-
return [3 /*break*/, 10];
|
|
126
|
-
case 10:
|
|
127
|
-
return [2 /*return*/];
|
|
128
|
-
}
|
|
129
|
-
});
|
|
130
|
-
});
|
|
131
|
-
}, [chart, chartId]);
|
|
132
|
-
React.useEffect(function () {
|
|
133
|
-
setReady(true);
|
|
134
|
-
return function () {
|
|
135
|
-
// 清理工作
|
|
136
|
-
if (ref.current) {
|
|
137
|
-
ref.current.innerHTML = '';
|
|
138
|
-
}
|
|
139
|
-
};
|
|
140
|
-
}, []);
|
|
141
|
-
React.useEffect(function () {
|
|
142
|
-
if (ready) {
|
|
143
|
-
renderChart();
|
|
144
|
-
}
|
|
145
|
-
}, [ready, renderChart]);
|
|
146
|
-
// 如果 mermaid 不可用,显示友好的提示信息
|
|
147
|
-
if (mermaidAvailable === false) {
|
|
148
|
-
return /*#__PURE__*/runtime.jsxs("div", {
|
|
149
|
-
className: "mermaid-placeholder",
|
|
150
|
-
children: [/*#__PURE__*/runtime.jsx("p", {
|
|
151
|
-
children: "Mermaid library is not available. To enable chart rendering, please install mermaid:"
|
|
152
|
-
}), /*#__PURE__*/runtime.jsx("code", {
|
|
153
|
-
children: "npm install mermaid"
|
|
154
|
-
})]
|
|
155
|
-
});
|
|
156
|
-
}
|
|
157
|
-
if (!ready) return null;
|
|
158
|
-
if (error) return /*#__PURE__*/runtime.jsx("div", {
|
|
159
|
-
className: "mermaid-error",
|
|
160
|
-
children: "\u56FE\u8868\u6E32\u67D3\u5931\u8D25"
|
|
161
|
-
});
|
|
162
|
-
return /*#__PURE__*/runtime.jsx("div", {
|
|
163
|
-
className: "mermaid-wrapper",
|
|
164
|
-
children: /*#__PURE__*/runtime.jsx("div", {
|
|
165
|
-
ref: ref,
|
|
166
|
-
className: "mermaid-container"
|
|
167
|
-
})
|
|
168
|
-
});
|
|
169
|
-
}
|
|
170
|
-
|
|
171
|
-
exports.default = MermaidRenderer;
|
|
@@ -1,169 +0,0 @@
|
|
|
1
|
-
import { _ as __read, a as __awaiter, b as __generator } from './index-543584d8.js';
|
|
2
|
-
import { useRef, useState, useMemo, useCallback, useEffect } from 'react';
|
|
3
|
-
import { jsxs, jsx } from 'react/jsx-runtime';
|
|
4
|
-
import 'remark-math';
|
|
5
|
-
import 'remark-breaks';
|
|
6
|
-
import 'remark-gfm';
|
|
7
|
-
import '@mdx-js/mdx';
|
|
8
|
-
import 'rehype-katex';
|
|
9
|
-
import 'rehype-highlight';
|
|
10
|
-
|
|
11
|
-
var mermaidPromise = null;
|
|
12
|
-
var getMermaid = function () {
|
|
13
|
-
if (mermaidPromise) {
|
|
14
|
-
return mermaidPromise;
|
|
15
|
-
}
|
|
16
|
-
mermaidPromise = import('mermaid').then(function (module) {
|
|
17
|
-
return module.default || module;
|
|
18
|
-
}).catch(function (error) {
|
|
19
|
-
console.warn('Mermaid is not available. Install it to enable chart rendering.');
|
|
20
|
-
return null;
|
|
21
|
-
});
|
|
22
|
-
return mermaidPromise;
|
|
23
|
-
};
|
|
24
|
-
// 全局缓存
|
|
25
|
-
var globalSvgCache = new Map();
|
|
26
|
-
function MermaidRenderer(_a) {
|
|
27
|
-
var _this = this;
|
|
28
|
-
var chart = _a.chart,
|
|
29
|
-
index = _a.index;
|
|
30
|
-
var ref = useRef(null);
|
|
31
|
-
var _b = __read(useState(false), 2),
|
|
32
|
-
ready = _b[0],
|
|
33
|
-
setReady = _b[1];
|
|
34
|
-
var _c = __read(useState(null), 2),
|
|
35
|
-
error = _c[0],
|
|
36
|
-
setError = _c[1];
|
|
37
|
-
var _d = __read(useState(null), 2),
|
|
38
|
-
mermaidAvailable = _d[0],
|
|
39
|
-
setMermaidAvailable = _d[1];
|
|
40
|
-
var chartId = useMemo(function () {
|
|
41
|
-
return "mermaid-".concat(index, "-").concat(Math.random().toString(36).substr(2, 9));
|
|
42
|
-
}, [index]);
|
|
43
|
-
var renderChart = useCallback(function () {
|
|
44
|
-
return __awaiter(_this, void 0, void 0, function () {
|
|
45
|
-
var mermaid, cachedSvg, isValid, svg, renderError_1, error_1;
|
|
46
|
-
return __generator(this, function (_a) {
|
|
47
|
-
switch (_a.label) {
|
|
48
|
-
case 0:
|
|
49
|
-
if (!chart || !ref.current) return [2 /*return*/];
|
|
50
|
-
_a.label = 1;
|
|
51
|
-
case 1:
|
|
52
|
-
_a.trys.push([1, 9,, 10]);
|
|
53
|
-
return [4 /*yield*/, getMermaid()];
|
|
54
|
-
case 2:
|
|
55
|
-
mermaid = _a.sent();
|
|
56
|
-
// 如果 mermaid 不可用,显示友好的提示信息
|
|
57
|
-
if (!mermaid) {
|
|
58
|
-
setMermaidAvailable(false);
|
|
59
|
-
return [2 /*return*/];
|
|
60
|
-
}
|
|
61
|
-
setMermaidAvailable(true);
|
|
62
|
-
cachedSvg = globalSvgCache.get(chart);
|
|
63
|
-
if (cachedSvg) {
|
|
64
|
-
ref.current.innerHTML = cachedSvg;
|
|
65
|
-
return [2 /*return*/];
|
|
66
|
-
}
|
|
67
|
-
if (!!mermaid.initialized) return [3 /*break*/, 4];
|
|
68
|
-
// 设置全局错误处理函数
|
|
69
|
-
mermaid.parseError = function (err) {
|
|
70
|
-
console.warn('Mermaid parse error:', err.message);
|
|
71
|
-
};
|
|
72
|
-
return [4 /*yield*/, mermaid.initialize({
|
|
73
|
-
startOnLoad: false,
|
|
74
|
-
theme: 'default',
|
|
75
|
-
securityLevel: 'loose',
|
|
76
|
-
themeVariables: {
|
|
77
|
-
primaryColor: '#2196f3'
|
|
78
|
-
},
|
|
79
|
-
logLevel: 1 // 减少日志输出
|
|
80
|
-
})];
|
|
81
|
-
case 3:
|
|
82
|
-
_a.sent();
|
|
83
|
-
_a.label = 4;
|
|
84
|
-
case 4:
|
|
85
|
-
_a.trys.push([4, 7,, 8]);
|
|
86
|
-
return [4 /*yield*/, mermaid.parse(chart.trim(), {
|
|
87
|
-
suppressErrors: true
|
|
88
|
-
})];
|
|
89
|
-
case 5:
|
|
90
|
-
isValid = _a.sent();
|
|
91
|
-
if (!isValid) {
|
|
92
|
-
throw new Error('Invalid mermaid syntax');
|
|
93
|
-
}
|
|
94
|
-
return [4 /*yield*/, mermaid.render(chartId, chart.trim())];
|
|
95
|
-
case 6:
|
|
96
|
-
svg = _a.sent().svg;
|
|
97
|
-
if (ref.current) {
|
|
98
|
-
ref.current.innerHTML = svg;
|
|
99
|
-
// 更新全局缓存
|
|
100
|
-
globalSvgCache.set(chart, svg);
|
|
101
|
-
}
|
|
102
|
-
setError(null);
|
|
103
|
-
return [3 /*break*/, 8];
|
|
104
|
-
case 7:
|
|
105
|
-
renderError_1 = _a.sent();
|
|
106
|
-
// 忽略渲染错误,设置错误状态但不抛出异常
|
|
107
|
-
setError(renderError_1 instanceof Error ? renderError_1.message : 'Failed to render chart');
|
|
108
|
-
// 清空容器内容以避免显示旧内容
|
|
109
|
-
if (ref.current) {
|
|
110
|
-
ref.current.innerHTML = '';
|
|
111
|
-
}
|
|
112
|
-
return [3 /*break*/, 8];
|
|
113
|
-
case 8:
|
|
114
|
-
return [3 /*break*/, 10];
|
|
115
|
-
case 9:
|
|
116
|
-
error_1 = _a.sent();
|
|
117
|
-
// 处理初始化或其他错误
|
|
118
|
-
console.error('Mermaid initialization failed:', error_1);
|
|
119
|
-
setError(error_1 instanceof Error ? error_1.message : 'Failed to render chart');
|
|
120
|
-
if (ref.current) {
|
|
121
|
-
ref.current.innerHTML = '';
|
|
122
|
-
}
|
|
123
|
-
return [3 /*break*/, 10];
|
|
124
|
-
case 10:
|
|
125
|
-
return [2 /*return*/];
|
|
126
|
-
}
|
|
127
|
-
});
|
|
128
|
-
});
|
|
129
|
-
}, [chart, chartId]);
|
|
130
|
-
useEffect(function () {
|
|
131
|
-
setReady(true);
|
|
132
|
-
return function () {
|
|
133
|
-
// 清理工作
|
|
134
|
-
if (ref.current) {
|
|
135
|
-
ref.current.innerHTML = '';
|
|
136
|
-
}
|
|
137
|
-
};
|
|
138
|
-
}, []);
|
|
139
|
-
useEffect(function () {
|
|
140
|
-
if (ready) {
|
|
141
|
-
renderChart();
|
|
142
|
-
}
|
|
143
|
-
}, [ready, renderChart]);
|
|
144
|
-
// 如果 mermaid 不可用,显示友好的提示信息
|
|
145
|
-
if (mermaidAvailable === false) {
|
|
146
|
-
return /*#__PURE__*/jsxs("div", {
|
|
147
|
-
className: "mermaid-placeholder",
|
|
148
|
-
children: [/*#__PURE__*/jsx("p", {
|
|
149
|
-
children: "Mermaid library is not available. To enable chart rendering, please install mermaid:"
|
|
150
|
-
}), /*#__PURE__*/jsx("code", {
|
|
151
|
-
children: "npm install mermaid"
|
|
152
|
-
})]
|
|
153
|
-
});
|
|
154
|
-
}
|
|
155
|
-
if (!ready) return null;
|
|
156
|
-
if (error) return /*#__PURE__*/jsx("div", {
|
|
157
|
-
className: "mermaid-error",
|
|
158
|
-
children: "\u56FE\u8868\u6E32\u67D3\u5931\u8D25"
|
|
159
|
-
});
|
|
160
|
-
return /*#__PURE__*/jsx("div", {
|
|
161
|
-
className: "mermaid-wrapper",
|
|
162
|
-
children: /*#__PURE__*/jsx("div", {
|
|
163
|
-
ref: ref,
|
|
164
|
-
className: "mermaid-container"
|
|
165
|
-
})
|
|
166
|
-
});
|
|
167
|
-
}
|
|
168
|
-
|
|
169
|
-
export { MermaidRenderer as default };
|