@antv/dumi-theme-antv 0.7.10 → 0.8.0-alpha.3
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/dist/builtins/Playground/index.js +1 -1
- package/dist/builtins/Playground/index.module.less +0 -1
- package/dist/common/styles/Common.js +1 -1
- package/dist/common/styles/theme.js +1 -1
- package/dist/components/AI/HomeDialog/AntVBanner/index.js +4 -0
- package/dist/components/AI/HomeDialog/AntVBanner/index.module.less +35 -0
- package/dist/components/AI/HomeDialog/ModeSelector/ModeSelectorDropdown.js +42 -0
- package/dist/components/AI/HomeDialog/ModeSelector/index.js +32 -0
- package/dist/components/AI/HomeDialog/ModeSelector/index.module.less +289 -0
- package/dist/components/AI/HomeDialog/PromptTextarea/ChooseLib/index.js +62 -0
- package/dist/components/AI/HomeDialog/PromptTextarea/ChooseLib/index.module.less +4 -0
- package/dist/components/AI/HomeDialog/PromptTextarea/DatasourceCard/index.js +25 -0
- package/dist/components/AI/HomeDialog/PromptTextarea/DatasourceCard/index.module.less +42 -0
- package/dist/components/AI/HomeDialog/PromptTextarea/SendButton.js +23 -0
- package/dist/components/AI/HomeDialog/PromptTextarea/SendButton.module.less +9 -0
- package/dist/components/AI/HomeDialog/PromptTextarea/Uploader/DataUploader.js +225 -0
- package/dist/components/AI/HomeDialog/PromptTextarea/index.js +172 -0
- package/dist/components/AI/HomeDialog/PromptTextarea/index.module.less +128 -0
- package/dist/components/AI/HomeDialog/RecommendCase/Card.js +80 -0
- package/dist/components/AI/HomeDialog/RecommendCase/card.module.less +131 -0
- package/dist/components/AI/HomeDialog/RecommendCase/index.js +130 -0
- package/dist/components/AI/HomeDialog/RecommendCase/index.module.less +45 -0
- package/dist/components/AI/HomeDialog/RecommendCase/recommend.json +66 -0
- package/dist/components/AI/HomeDialog/index.js +62 -0
- package/dist/components/AI/HomeDialog/index.module.less +3 -0
- package/dist/components/AI/constant.js +37 -0
- package/dist/components/AI/index.js +1 -0
- package/dist/components/AI/types.js +1 -0
- package/dist/components/AI/utils.js +38 -0
- package/dist/components/Login/Captcha/index.js +185 -0
- package/dist/components/Login/Captcha/index.less +91 -0
- package/dist/components/Login/CheckCode/index.js +244 -0
- package/dist/components/Login/CheckCode/index.less +137 -0
- package/dist/components/Login/CountDownButton/index.js +109 -0
- package/dist/components/Login/CountDownButton/index.less +8 -0
- package/dist/components/Login/LoginForm.js +239 -0
- package/dist/components/Login/LoginForm.less +408 -0
- package/dist/components/Login/index.js +24 -0
- package/dist/components/Login/openAuthWindow.js +54 -0
- package/dist/components/Login/types.js +5 -0
- package/dist/components/Login/utils.js +47 -0
- package/dist/hooks/useProducts.js +39 -0
- package/dist/hooks/useStreamingText.js +139 -0
- package/dist/hooks/useTypewriter.js +69 -0
- package/dist/hooks/useVisionsnapSdk.js +159 -0
- package/dist/layouts/DocLayout.js +2 -2
- package/dist/layouts/GlobalLayout/index.js +22 -0
- package/dist/locales/en.json +132 -1
- package/dist/locales/zh.json +132 -1
- package/dist/model/AIChat.js +313 -0
- package/dist/model/auth.js +147 -0
- package/dist/pages/AIPlayground/components/ConversationsMenu/index.js +176 -0
- package/dist/pages/AIPlayground/components/ConversationsMenu/index.module.less +46 -0
- package/dist/pages/AIPlayground/components/MarkdownComponent/MarkdownCodeBlock.js +97 -0
- package/dist/pages/AIPlayground/components/MarkdownComponent/MarkdownCodeBlock.module.less +13 -0
- package/dist/pages/AIPlayground/components/MarkdownComponent/index.js +50 -0
- package/dist/pages/AIPlayground/components/MsgBox/index.js +407 -0
- package/dist/pages/AIPlayground/components/MsgBox/index.module.less +43 -0
- package/dist/pages/AIPlayground/components/MsgBox/useAutoScroll.js +46 -0
- package/dist/pages/AIPlayground/components/SessionLayout/index.js +62 -0
- package/dist/pages/AIPlayground/components/SessionLayout/index.module.less +37 -0
- package/dist/pages/AIPlayground/components/TaskBox/generateCode.js +230 -0
- package/dist/pages/AIPlayground/components/TaskBox/index.js +101 -0
- package/dist/pages/AIPlayground/components/TaskBox/index.module.less +9 -0
- package/dist/pages/AIPlayground/demo.js +34 -0
- package/dist/pages/AIPlayground/index.js +12 -0
- package/dist/pages/AIPlayground/index.module.less +5 -0
- package/dist/pages/Examples/components/Accouncement/index.module.less +1 -1
- package/dist/pages/Examples/index.module.less +11 -11
- package/dist/pages/Index/components/Cases/index.module.less +8 -8
- package/dist/pages/Index/components/Companies/index.module.less +4 -3
- package/dist/pages/Index/components/Features/FeatureCard.module.less +4 -5
- package/dist/pages/Index/components/Features/index.module.less +5 -5
- package/dist/pages/Index/components/_.less +9 -9
- package/dist/pages/Index/index.js +1 -1
- package/dist/plugin/index.js +14 -6
- package/dist/slots/Banner/Notification.module.less +8 -8
- package/dist/slots/Banner/index.module.less +10 -9
- package/dist/slots/CodeEditor/Toolbar.js +23 -27
- package/dist/slots/CodeEditor/Toolbar.module.less +7 -0
- package/dist/slots/CodeEditor/index.js +67 -5
- package/dist/slots/CodeEditor/index.module.less +24 -0
- package/dist/slots/CodeEditor/utils.js +2 -1
- package/dist/slots/CodePreview/index.module.less +0 -3
- package/dist/slots/CodeRunner/index.js +24 -11
- package/dist/slots/ContentTable/index.module.less +2 -1
- package/dist/{pages/Index/components → slots}/Detail/News.js +1 -1
- package/dist/{pages/Index/components → slots}/Detail/News.module.less +9 -9
- package/dist/{pages/Index/components → slots}/Detail/index.js +13 -29
- package/dist/{pages/Index/components → slots}/Detail/index.module.less +23 -20
- package/dist/slots/ExampleSider/index.module.less +3 -4
- package/dist/slots/Footer/index.module.less +2 -2
- package/dist/slots/Header/Products/Product.module.less +2 -2
- package/dist/slots/Header/Products/getProducts.js +20 -26
- package/dist/slots/Header/Products/index.js +20 -16
- package/dist/slots/Header/Search/SearchResult.js +53 -14
- package/dist/slots/Header/Search/SearchResult.module.less +1 -0
- package/dist/slots/Header/Search/index.js +2 -1
- package/dist/slots/Header/index.js +72 -30
- package/dist/slots/Header/index.module.less +14 -6
- package/dist/slots/LiveExample/index.js +1 -1
- package/dist/slots/LiveExample/index.module.less +1 -1
- package/dist/slots/Loading/index.module.less +30 -28
- package/dist/slots/ManualContent/index.module.less +14 -17
- package/dist/slots/_.less +9 -9
- package/dist/static/user.svg +3 -0
- package/dist/typings.d.ts +11 -0
- package/dist/utils/analytics.js +16 -0
- package/dist/utils/code.js +35 -0
- package/dist/utils/env.js +63 -0
- package/dist/utils/index.js +7 -0
- package/dist/utils/request.js +42 -0
- package/package.json +31 -15
|
@@ -0,0 +1,176 @@
|
|
|
1
|
+
function _slicedToArray(arr, i) { return _arrayWithHoles(arr) || _iterableToArrayLimit(arr, i) || _unsupportedIterableToArray(arr, i) || _nonIterableRest(); }
|
|
2
|
+
function _nonIterableRest() { throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); }
|
|
3
|
+
function _unsupportedIterableToArray(o, minLen) { if (!o) return; if (typeof o === "string") return _arrayLikeToArray(o, minLen); var n = Object.prototype.toString.call(o).slice(8, -1); if (n === "Object" && o.constructor) n = o.constructor.name; if (n === "Map" || n === "Set") return Array.from(o); if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen); }
|
|
4
|
+
function _arrayLikeToArray(arr, len) { if (len == null || len > arr.length) len = arr.length; for (var i = 0, arr2 = new Array(len); i < len; i++) arr2[i] = arr[i]; return arr2; }
|
|
5
|
+
function _iterableToArrayLimit(r, l) { var t = null == r ? null : "undefined" != typeof Symbol && r[Symbol.iterator] || r["@@iterator"]; if (null != t) { var e, n, i, u, a = [], f = !0, o = !1; try { if (i = (t = t.call(r)).next, 0 === l) { if (Object(t) !== t) return; f = !1; } else for (; !(f = (e = i.call(t)).done) && (a.push(e.value), a.length !== l); f = !0); } catch (r) { o = !0, n = r; } finally { try { if (!f && null != t.return && (u = t.return(), Object(u) !== u)) return; } finally { if (o) throw n; } } return a; } }
|
|
6
|
+
function _arrayWithHoles(arr) { if (Array.isArray(arr)) return arr; }
|
|
7
|
+
import React, { useState } from 'react';
|
|
8
|
+
import { DeleteOutlined, EditOutlined, EllipsisOutlined, HistoryOutlined, MenuFoldOutlined, MenuUnfoldOutlined, PlusSquareOutlined, VerticalAlignTopOutlined } from '@ant-design/icons';
|
|
9
|
+
import { Dropdown, Input, Modal } from 'antd';
|
|
10
|
+
import { Menu } from 'antd';
|
|
11
|
+
import styles from "./index.module.less";
|
|
12
|
+
import { useSnapshot } from 'valtio';
|
|
13
|
+
import { AIChatStore, createPureNewSession, handleDeleteSession, handlePinSession, handleRenameSession } from "../../../../model/AIChat";
|
|
14
|
+
import { useSetState } from "ahooks";
|
|
15
|
+
import { useIntl } from 'dumi';
|
|
16
|
+
import { isUUID } from "../../../../utils";
|
|
17
|
+
export var ConversationsMenu = function ConversationsMenu() {
|
|
18
|
+
var _useSetState = useSetState({
|
|
19
|
+
open: false,
|
|
20
|
+
session: null,
|
|
21
|
+
rename: ''
|
|
22
|
+
}),
|
|
23
|
+
_useSetState2 = _slicedToArray(_useSetState, 2),
|
|
24
|
+
state = _useSetState2[0],
|
|
25
|
+
setState = _useSetState2[1];
|
|
26
|
+
var _useState = useState(false),
|
|
27
|
+
_useState2 = _slicedToArray(_useState, 2),
|
|
28
|
+
collapsed = _useState2[0],
|
|
29
|
+
setCollapsed = _useState2[1];
|
|
30
|
+
var snap = useSnapshot(AIChatStore);
|
|
31
|
+
var handleSelectSession = function handleSelectSession(sessionId) {
|
|
32
|
+
if (isUUID(sessionId)) {
|
|
33
|
+
AIChatStore.activeSessionId = sessionId;
|
|
34
|
+
}
|
|
35
|
+
};
|
|
36
|
+
var toggleCollapsed = function toggleCollapsed() {
|
|
37
|
+
setCollapsed(!collapsed);
|
|
38
|
+
};
|
|
39
|
+
var _useIntl = useIntl(),
|
|
40
|
+
formatMessage = _useIntl.formatMessage;
|
|
41
|
+
var items = [{
|
|
42
|
+
key: 'fold',
|
|
43
|
+
extra: !collapsed ? /*#__PURE__*/React.createElement(MenuFoldOutlined, null) : null,
|
|
44
|
+
onClick: toggleCollapsed,
|
|
45
|
+
label: null,
|
|
46
|
+
icon: !collapsed ? null : /*#__PURE__*/React.createElement(MenuUnfoldOutlined, null),
|
|
47
|
+
title: collapsed ? formatMessage({
|
|
48
|
+
id: 'ai.conversations.expand'
|
|
49
|
+
}) : formatMessage({
|
|
50
|
+
id: 'ai.conversations.collapse'
|
|
51
|
+
})
|
|
52
|
+
}, {
|
|
53
|
+
key: 'new',
|
|
54
|
+
icon: /*#__PURE__*/React.createElement(PlusSquareOutlined, null),
|
|
55
|
+
label: formatMessage({
|
|
56
|
+
id: 'ai.conversations.new'
|
|
57
|
+
}),
|
|
58
|
+
onClick: function onClick() {
|
|
59
|
+
return createPureNewSession();
|
|
60
|
+
}
|
|
61
|
+
}, {
|
|
62
|
+
key: 'history',
|
|
63
|
+
label: formatMessage({
|
|
64
|
+
id: 'ai.conversations.history'
|
|
65
|
+
}),
|
|
66
|
+
icon: /*#__PURE__*/React.createElement(HistoryOutlined, null),
|
|
67
|
+
children: snap.sessions.map(function (session) {
|
|
68
|
+
return {
|
|
69
|
+
key: session.id,
|
|
70
|
+
label: /*#__PURE__*/React.createElement("div", {
|
|
71
|
+
className: styles.menuItem
|
|
72
|
+
}, /*#__PURE__*/React.createElement("span", {
|
|
73
|
+
className: styles.title
|
|
74
|
+
}, session.title), /*#__PURE__*/React.createElement(Dropdown, {
|
|
75
|
+
menu: {
|
|
76
|
+
items: [{
|
|
77
|
+
key: 'edit',
|
|
78
|
+
label: formatMessage({
|
|
79
|
+
id: 'ai.conversations.rename'
|
|
80
|
+
}),
|
|
81
|
+
icon: /*#__PURE__*/React.createElement(EditOutlined, null),
|
|
82
|
+
onClick: function onClick(_ref) {
|
|
83
|
+
var domEvent = _ref.domEvent;
|
|
84
|
+
domEvent.stopPropagation();
|
|
85
|
+
setState({
|
|
86
|
+
open: true,
|
|
87
|
+
session: session,
|
|
88
|
+
rename: session.title.slice(0, 100)
|
|
89
|
+
});
|
|
90
|
+
}
|
|
91
|
+
}, {
|
|
92
|
+
key: 'top',
|
|
93
|
+
label: formatMessage({
|
|
94
|
+
id: 'ai.conversations.pin'
|
|
95
|
+
}),
|
|
96
|
+
icon: /*#__PURE__*/React.createElement(VerticalAlignTopOutlined, null),
|
|
97
|
+
onClick: function onClick(_ref2) {
|
|
98
|
+
var domEvent = _ref2.domEvent;
|
|
99
|
+
domEvent.stopPropagation();
|
|
100
|
+
handlePinSession(session.id);
|
|
101
|
+
}
|
|
102
|
+
}, {
|
|
103
|
+
key: 'delete',
|
|
104
|
+
label: formatMessage({
|
|
105
|
+
id: 'ai.conversations.delete'
|
|
106
|
+
}),
|
|
107
|
+
icon: /*#__PURE__*/React.createElement(DeleteOutlined, null),
|
|
108
|
+
onClick: function onClick(_ref3) {
|
|
109
|
+
var domEvent = _ref3.domEvent;
|
|
110
|
+
domEvent.stopPropagation();
|
|
111
|
+
handleDeleteSession(session.id);
|
|
112
|
+
}
|
|
113
|
+
}]
|
|
114
|
+
},
|
|
115
|
+
trigger: ['click']
|
|
116
|
+
}, /*#__PURE__*/React.createElement("span", {
|
|
117
|
+
className: styles.iconWrapper,
|
|
118
|
+
onClick: function onClick(e) {
|
|
119
|
+
e.preventDefault();
|
|
120
|
+
e.stopPropagation();
|
|
121
|
+
}
|
|
122
|
+
}, /*#__PURE__*/React.createElement(EllipsisOutlined, null))))
|
|
123
|
+
};
|
|
124
|
+
})
|
|
125
|
+
}];
|
|
126
|
+
return /*#__PURE__*/React.createElement("div", {
|
|
127
|
+
className: styles.container
|
|
128
|
+
}, /*#__PURE__*/React.createElement(Menu, {
|
|
129
|
+
selectedKeys: [snap.activeSessionId],
|
|
130
|
+
defaultOpenKeys: ['history'],
|
|
131
|
+
mode: "inline",
|
|
132
|
+
theme: "light",
|
|
133
|
+
inlineCollapsed: collapsed,
|
|
134
|
+
items: items,
|
|
135
|
+
onSelect: function onSelect(_ref4) {
|
|
136
|
+
var key = _ref4.key;
|
|
137
|
+
return handleSelectSession(key);
|
|
138
|
+
}
|
|
139
|
+
}), /*#__PURE__*/React.createElement(Modal, {
|
|
140
|
+
title: formatMessage({
|
|
141
|
+
id: 'ai.conversations.edit.title'
|
|
142
|
+
}),
|
|
143
|
+
open: state.open,
|
|
144
|
+
centered: true,
|
|
145
|
+
maskClosable: false,
|
|
146
|
+
onOk: function onOk() {
|
|
147
|
+
handleRenameSession(state.session.id, state.rename);
|
|
148
|
+
setState({
|
|
149
|
+
open: false
|
|
150
|
+
});
|
|
151
|
+
},
|
|
152
|
+
onCancel: function onCancel() {
|
|
153
|
+
return setState({
|
|
154
|
+
open: false
|
|
155
|
+
});
|
|
156
|
+
},
|
|
157
|
+
okButtonProps: {
|
|
158
|
+
disabled: !state.rename
|
|
159
|
+
},
|
|
160
|
+
okText: formatMessage({
|
|
161
|
+
id: 'ai.conversations.ok'
|
|
162
|
+
}),
|
|
163
|
+
cancelText: formatMessage({
|
|
164
|
+
id: 'ai.conversations.cancel'
|
|
165
|
+
})
|
|
166
|
+
}, /*#__PURE__*/React.createElement(Input, {
|
|
167
|
+
showCount: true,
|
|
168
|
+
maxLength: 100,
|
|
169
|
+
onChange: function onChange(e) {
|
|
170
|
+
return setState({
|
|
171
|
+
rename: e.target.value
|
|
172
|
+
});
|
|
173
|
+
},
|
|
174
|
+
value: state.rename
|
|
175
|
+
})));
|
|
176
|
+
};
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
.container {
|
|
2
|
+
background: #fff;
|
|
3
|
+
|
|
4
|
+
:global {
|
|
5
|
+
.ant-menu {
|
|
6
|
+
width: 16vw;
|
|
7
|
+
min-width: 200px;
|
|
8
|
+
height: 100%;
|
|
9
|
+
overflow-y: auto;
|
|
10
|
+
overflow-x: hidden;
|
|
11
|
+
}
|
|
12
|
+
|
|
13
|
+
.ant-menu-inline-collapsed{
|
|
14
|
+
width: 80px;
|
|
15
|
+
min-width: 80px;
|
|
16
|
+
}
|
|
17
|
+
}
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
.title {
|
|
21
|
+
width: 200px;
|
|
22
|
+
overflow: hidden;
|
|
23
|
+
white-space: nowrap;
|
|
24
|
+
text-overflow: ellipsis;
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
.menuItem{
|
|
28
|
+
display: flex;
|
|
29
|
+
justify-content: space-between;
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
.iconWrapper{
|
|
33
|
+
display: inline-flex;
|
|
34
|
+
align-items: center;
|
|
35
|
+
justify-content: center;
|
|
36
|
+
width: 20px;
|
|
37
|
+
height: 20px;
|
|
38
|
+
margin-top: 10px;
|
|
39
|
+
border-radius: 50%;
|
|
40
|
+
transition: background-color 0.3s ease;
|
|
41
|
+
cursor: pointer;
|
|
42
|
+
|
|
43
|
+
&:hover{
|
|
44
|
+
background-color: #fbfcfd;
|
|
45
|
+
}
|
|
46
|
+
}
|
|
@@ -0,0 +1,97 @@
|
|
|
1
|
+
function _slicedToArray(arr, i) { return _arrayWithHoles(arr) || _iterableToArrayLimit(arr, i) || _unsupportedIterableToArray(arr, i) || _nonIterableRest(); }
|
|
2
|
+
function _nonIterableRest() { throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); }
|
|
3
|
+
function _unsupportedIterableToArray(o, minLen) { if (!o) return; if (typeof o === "string") return _arrayLikeToArray(o, minLen); var n = Object.prototype.toString.call(o).slice(8, -1); if (n === "Object" && o.constructor) n = o.constructor.name; if (n === "Map" || n === "Set") return Array.from(o); if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen); }
|
|
4
|
+
function _arrayLikeToArray(arr, len) { if (len == null || len > arr.length) len = arr.length; for (var i = 0, arr2 = new Array(len); i < len; i++) arr2[i] = arr[i]; return arr2; }
|
|
5
|
+
function _iterableToArrayLimit(r, l) { var t = null == r ? null : "undefined" != typeof Symbol && r[Symbol.iterator] || r["@@iterator"]; if (null != t) { var e, n, i, u, a = [], f = !0, o = !1; try { if (i = (t = t.call(r)).next, 0 === l) { if (Object(t) !== t) return; f = !1; } else for (; !(f = (e = i.call(t)).done) && (a.push(e.value), a.length !== l); f = !0); } catch (r) { o = !0, n = r; } finally { try { if (!f && null != t.return && (u = t.return(), Object(u) !== u)) return; } finally { if (o) throw n; } } return a; } }
|
|
6
|
+
function _arrayWithHoles(arr) { if (Array.isArray(arr)) return arr; }
|
|
7
|
+
import React from 'react';
|
|
8
|
+
import { Prism as SyntaxHighlighter } from 'react-syntax-highlighter';
|
|
9
|
+
import { oneLight } from 'react-syntax-highlighter/dist/esm/styles/prism';
|
|
10
|
+
import { AIChatStore } from "../../../../model/AIChat";
|
|
11
|
+
import { useCopyToClipboard } from 'react-use';
|
|
12
|
+
import { CheckOutlined, CopyOutlined, PlaySquareOutlined } from '@ant-design/icons';
|
|
13
|
+
import { Button, Space, Tooltip } from 'antd';
|
|
14
|
+
import styles from "./MarkdownCodeBlock.module.less";
|
|
15
|
+
import { useIntl } from 'dumi'; // 定义 props 类型,它将接收 react-markdown 传递的所有属性
|
|
16
|
+
|
|
17
|
+
// 定义 props 类型,它将接收 react-markdown 传递的所有属性
|
|
18
|
+
|
|
19
|
+
export var MarkdownCodeBlock = /*#__PURE__*/React.memo(function (_ref) {
|
|
20
|
+
var inline = _ref.inline,
|
|
21
|
+
className = _ref.className,
|
|
22
|
+
children = _ref.children,
|
|
23
|
+
_ref$showRunButton = _ref.showRunButton,
|
|
24
|
+
showRunButtonProp = _ref$showRunButton === void 0 ? true : _ref$showRunButton;
|
|
25
|
+
var intl = useIntl();
|
|
26
|
+
var _useCopyToClipboard = useCopyToClipboard(),
|
|
27
|
+
_useCopyToClipboard2 = _slicedToArray(_useCopyToClipboard, 2),
|
|
28
|
+
copyState = _useCopyToClipboard2[0],
|
|
29
|
+
copyToClipboard = _useCopyToClipboard2[1];
|
|
30
|
+
// 1. 处理行内代码:如果是行内代码,不做特殊处理,直接返回一个 <code> 标签
|
|
31
|
+
if (inline || typeof children === 'string' && !children.includes('\n')) {
|
|
32
|
+
return /*#__PURE__*/React.createElement("code", {
|
|
33
|
+
className: className
|
|
34
|
+
}, children);
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
// 2. 提取语言:从 className 中提取代码语言,例如 "language-javascript" -> "javascript"
|
|
38
|
+
var match = /language-(\w+)/.exec(className || '');
|
|
39
|
+
var language = match ? match[1] : 'text'; // 如果没有指定语言,默认为纯文本
|
|
40
|
+
|
|
41
|
+
// 3. 将 children 转换为字符串,并移除末尾的换行符
|
|
42
|
+
var codeString = String(children).replace(/\n$/, '');
|
|
43
|
+
|
|
44
|
+
// 4. 判断是否显示“运行”按钮
|
|
45
|
+
var showRunButton = showRunButtonProp && /\bimport\b/.test(codeString);
|
|
46
|
+
|
|
47
|
+
// 5. 定义运行代码的逻辑
|
|
48
|
+
var handleRunCode = function handleRunCode() {
|
|
49
|
+
// console.log("准备运行的代码:", codeString);
|
|
50
|
+
AIChatStore.codeBlock = codeString;
|
|
51
|
+
};
|
|
52
|
+
|
|
53
|
+
// 6. 返回最终的 JSX 结构
|
|
54
|
+
return /*#__PURE__*/React.createElement("div", {
|
|
55
|
+
style: {
|
|
56
|
+
position: 'relative',
|
|
57
|
+
margin: '1em 0'
|
|
58
|
+
}
|
|
59
|
+
}, /*#__PURE__*/React.createElement(Space, {
|
|
60
|
+
className: styles.button
|
|
61
|
+
}, /*#__PURE__*/React.createElement(Tooltip, {
|
|
62
|
+
title: intl.formatMessage({
|
|
63
|
+
id: 'ai.markdown.copy'
|
|
64
|
+
})
|
|
65
|
+
}, /*#__PURE__*/React.createElement(Button, {
|
|
66
|
+
variant: "link",
|
|
67
|
+
size: "small",
|
|
68
|
+
onClick: function onClick() {
|
|
69
|
+
return copyToClipboard(codeString);
|
|
70
|
+
},
|
|
71
|
+
title: intl.formatMessage({
|
|
72
|
+
id: 'ai.markdown.copy'
|
|
73
|
+
})
|
|
74
|
+
}, copyState.value === codeString ? /*#__PURE__*/React.createElement(CheckOutlined, null) : /*#__PURE__*/React.createElement(CopyOutlined, null))), showRunButton && /*#__PURE__*/React.createElement(Tooltip, {
|
|
75
|
+
title: intl.formatMessage({
|
|
76
|
+
id: 'ai.markdown.run'
|
|
77
|
+
})
|
|
78
|
+
}, /*#__PURE__*/React.createElement(Button, {
|
|
79
|
+
variant: "link",
|
|
80
|
+
size: "small",
|
|
81
|
+
onClick: handleRunCode,
|
|
82
|
+
title: intl.formatMessage({
|
|
83
|
+
id: 'ai.markdown.run'
|
|
84
|
+
})
|
|
85
|
+
}, /*#__PURE__*/React.createElement(PlaySquareOutlined, null)))), /*#__PURE__*/React.createElement(SyntaxHighlighter, {
|
|
86
|
+
style: oneLight,
|
|
87
|
+
language: language === 'vue' ? 'html' : language,
|
|
88
|
+
PreTag: "div" // 使用 div 作为外层标签,避免 pre 标签的默认样式冲突
|
|
89
|
+
,
|
|
90
|
+
showLineNumbers: false // (可选) 显示行号
|
|
91
|
+
,
|
|
92
|
+
customStyle: {
|
|
93
|
+
paddingTop: '2em',
|
|
94
|
+
background: '#fafafa'
|
|
95
|
+
}
|
|
96
|
+
}, codeString));
|
|
97
|
+
});
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
var _excluded = ["node"];
|
|
2
|
+
function _extends() { _extends = Object.assign ? Object.assign.bind() : function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; }; return _extends.apply(this, arguments); }
|
|
3
|
+
function _objectWithoutProperties(source, excluded) { if (source == null) return {}; var target = _objectWithoutPropertiesLoose(source, excluded); var key, i; if (Object.getOwnPropertySymbols) { var sourceSymbolKeys = Object.getOwnPropertySymbols(source); for (i = 0; i < sourceSymbolKeys.length; i++) { key = sourceSymbolKeys[i]; if (excluded.indexOf(key) >= 0) continue; if (!Object.prototype.propertyIsEnumerable.call(source, key)) continue; target[key] = source[key]; } } return target; }
|
|
4
|
+
function _objectWithoutPropertiesLoose(source, excluded) { if (source == null) return {}; var target = {}; var sourceKeys = Object.keys(source); var key, i; for (i = 0; i < sourceKeys.length; i++) { key = sourceKeys[i]; if (excluded.indexOf(key) >= 0) continue; target[key] = source[key]; } return target; }
|
|
5
|
+
import React from 'react';
|
|
6
|
+
import Markdown from 'react-markdown';
|
|
7
|
+
import rehypeRaw from 'rehype-raw';
|
|
8
|
+
import remarkGfm from 'remark-gfm';
|
|
9
|
+
import { MarkdownCodeBlock } from "./MarkdownCodeBlock"; // 引入我们创建的自定义组件
|
|
10
|
+
|
|
11
|
+
export var MarkdownComponent = /*#__PURE__*/React.memo(function (_ref) {
|
|
12
|
+
var content = _ref.content,
|
|
13
|
+
showRunButton = _ref.showRunButton;
|
|
14
|
+
return /*#__PURE__*/React.createElement(Markdown, {
|
|
15
|
+
remarkPlugins: [remarkGfm],
|
|
16
|
+
rehypePlugins: [rehypeRaw],
|
|
17
|
+
components: {
|
|
18
|
+
// 1. 重写 `p` 标签的渲染
|
|
19
|
+
p: function p(props) {
|
|
20
|
+
var node = props.node,
|
|
21
|
+
rest = _objectWithoutProperties(props, _excluded);
|
|
22
|
+
return /*#__PURE__*/React.createElement("p", _extends({
|
|
23
|
+
style: {
|
|
24
|
+
marginBottom: 'unset',
|
|
25
|
+
lineHeight: '1.6'
|
|
26
|
+
}
|
|
27
|
+
}, rest));
|
|
28
|
+
},
|
|
29
|
+
// 2. 【核心】重写 `code` 标签的渲染,使用我们自己的组件
|
|
30
|
+
code: function code(props) {
|
|
31
|
+
return /*#__PURE__*/React.createElement(MarkdownCodeBlock, _extends({
|
|
32
|
+
showRunButton: showRunButton
|
|
33
|
+
}, props));
|
|
34
|
+
},
|
|
35
|
+
// 3. 重写非标准 `description` 标签的渲染
|
|
36
|
+
// @ts-expect-error - 告知 TypeScript 我们知道这是一个自定义的、非标准的 HTML 标签
|
|
37
|
+
description: function description(props) {
|
|
38
|
+
return /*#__PURE__*/React.createElement("span", _extends({
|
|
39
|
+
style: {
|
|
40
|
+
fontSize: '12px',
|
|
41
|
+
color: '#777',
|
|
42
|
+
display: 'block'
|
|
43
|
+
}
|
|
44
|
+
}, props));
|
|
45
|
+
} // 你还可以重写更多...
|
|
46
|
+
// h1: (props) => <h1 style={{ color: 'blue' }} {...props} />,
|
|
47
|
+
// a: (props) => <a style={{ color: 'green' }} target="_blank" rel="noopener noreferrer" {...props} />,
|
|
48
|
+
}
|
|
49
|
+
}, content);
|
|
50
|
+
});
|