ds-markdown 0.1.1 → 0.1.2-beta.0
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.en.md +129 -240
- package/README.ja.md +209 -161
- package/README.ko.md +323 -236
- package/README.md +67 -37
- package/dist/cjs/MarkdownCMD/index.js +23 -17
- package/dist/cjs/MarkdownCMD/index.js.map +1 -1
- package/dist/cjs/defined.d.ts +3 -2
- package/dist/cjs/hooks/useTypingTask.d.ts +2 -0
- package/dist/cjs/hooks/useTypingTask.js +53 -2
- package/dist/cjs/hooks/useTypingTask.js.map +1 -1
- package/dist/esm/MarkdownCMD/index.js +23 -17
- package/dist/esm/MarkdownCMD/index.js.map +1 -1
- package/dist/esm/defined.d.ts +3 -2
- package/dist/esm/hooks/useTypingTask.d.ts +2 -0
- package/dist/esm/hooks/useTypingTask.js +53 -2
- package/dist/esm/hooks/useTypingTask.js.map +1 -1
- package/package.json +2 -2
package/README.md
CHANGED
|
@@ -20,39 +20,30 @@
|
|
|
20
20
|
|
|
21
21
|
## ✨ 核心特性
|
|
22
22
|
|
|
23
|
-
###
|
|
23
|
+
### 🤖 **AI 对话场景**
|
|
24
24
|
|
|
25
25
|
- 1:1 复刻 [DeepSeek 官网](https://chat.deepseek.com/) 聊天响应效果
|
|
26
26
|
- 支持思考过程 (`thinking`) 和回答内容 (`answer`) 双模式
|
|
27
|
-
-
|
|
28
|
-
- 支持亮色/暗色主题切换,完美适配不同场景
|
|
27
|
+
- 流式数据完美适配,零延迟响应用户输入
|
|
29
28
|
|
|
30
|
-
###
|
|
29
|
+
### 📊 **内容展示场景**
|
|
31
30
|
|
|
32
|
-
-
|
|
33
|
-
-
|
|
34
|
-
-
|
|
31
|
+
- 完整 Markdown 语法支持,包括代码高亮、表格、列表等
|
|
32
|
+
- 数学公式渲染 (KaTeX),支持 `$...$` 和 `\[...\]` 语法
|
|
33
|
+
- 支持亮色/暗色主题,适配不同产品风格
|
|
34
|
+
- 插件化架构,支持 remark/rehype 插件扩展
|
|
35
|
+
|
|
36
|
+
### 🔧 **开发体验**
|
|
37
|
+
|
|
38
|
+
- 支持打字中断 `stop` 和继续 `resume`
|
|
39
|
+
- 支持打字关闭与开启
|
|
35
40
|
|
|
36
41
|
### 🎬 **流畅动画**
|
|
37
42
|
|
|
43
|
+
- 双模式定时器优化,支持`requestAnimationFrame`和`setTimeout`模式
|
|
38
44
|
- 高频打字支持(`requestAnimationFrame`模式下打字间隔最低可接近于`0ms`)
|
|
39
|
-
-
|
|
45
|
+
- 帧同步渲染,与浏览器刷新完美配合
|
|
40
46
|
- 智能字符批量处理,视觉效果更自然
|
|
41
|
-
- 支持打字的中断 `stop` 和 继续`resume`
|
|
42
|
-
|
|
43
|
-
### 🔧 **灵活易用**
|
|
44
|
-
|
|
45
|
-
- **声明式 API**:适合简单场景,React 风格
|
|
46
|
-
- **命令式 API**:适合流式数据,性能更优
|
|
47
|
-
- **TypeScript 原生支持**:完整类型提示
|
|
48
|
-
|
|
49
|
-
### 🧮 **数学公式支持**
|
|
50
|
-
|
|
51
|
-
- **KaTeX 集成**:高性能数学公式渲染
|
|
52
|
-
- **插件化架构**:通过插件系统灵活配置
|
|
53
|
-
- **双语法支持**:`$...$` 和 `\[...\]` 两种分隔符
|
|
54
|
-
- **流式兼容**:完美支持打字动画中的数学公式
|
|
55
|
-
- **主题适配**:自动适配亮色/暗色主题
|
|
56
47
|
|
|
57
48
|
---
|
|
58
49
|
|
|
@@ -107,6 +98,27 @@ function App() {
|
|
|
107
98
|
}
|
|
108
99
|
```
|
|
109
100
|
|
|
101
|
+
### 禁用打字动画
|
|
102
|
+
|
|
103
|
+
```tsx
|
|
104
|
+
import DsMarkdown from 'ds-markdown';
|
|
105
|
+
import 'ds-markdown/style.css';
|
|
106
|
+
|
|
107
|
+
function StaticDemo() {
|
|
108
|
+
const [disableTyping, setDisableTyping] = useState(false);
|
|
109
|
+
|
|
110
|
+
return (
|
|
111
|
+
<div>
|
|
112
|
+
<button onClick={() => setDisableTyping(!disableTyping)}>{disableTyping ? '开启' : '关闭'}打字机效果</button>
|
|
113
|
+
|
|
114
|
+
<DsMarkdown interval={20} answerType="answer" disableTyping={disableTyping}>
|
|
115
|
+
# 静态展示模式 当 `disableTyping` 为 `true` 时,内容会立即全部显示,无打字动画效果。 这在某些场景下非常有用: - 📄 静态文档展示 - 🔄 切换显示模式 - ⚡ 快速预览内容
|
|
116
|
+
</DsMarkdown>
|
|
117
|
+
</div>
|
|
118
|
+
);
|
|
119
|
+
}
|
|
120
|
+
```
|
|
121
|
+
|
|
110
122
|
### 数学公式支持
|
|
111
123
|
|
|
112
124
|
```tsx
|
|
@@ -174,19 +186,26 @@ React 19 带来了许多激动人心的新特性:
|
|
|
174
186
|
|
|
175
187
|
## 📚 完整 API 文档
|
|
176
188
|
|
|
177
|
-
###
|
|
189
|
+
### 默认导出 DsMarkdown 和 MarkdownCMD 的 props
|
|
178
190
|
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
|
|
|
184
|
-
|
|
|
185
|
-
| `
|
|
186
|
-
| `
|
|
187
|
-
| `
|
|
188
|
-
| `
|
|
189
|
-
| `
|
|
191
|
+
```js
|
|
192
|
+
import DsMarkdown, { MarkdownCMD } from 'ds-markdown';
|
|
193
|
+
```
|
|
194
|
+
|
|
195
|
+
| 属性 | 类型 | 说明 | 默认值 |
|
|
196
|
+
| --------------- | --------------------------------------------- | ----------------------- | ----------------------------------------------------------- |
|
|
197
|
+
| `interval` | `number` | 打字间隔 (毫秒) | `30` |
|
|
198
|
+
| `timerType` | `'setTimeout'` \| `'requestAnimationFrame'` | 定时器类型 | 当前默认值是`setTimeout`,后期会改为`requestAnimationFrame` |
|
|
199
|
+
| `answerType` | `'thinking'` \| `'answer'` | 内容类型 (影响样式主题) | `'answer'` |
|
|
200
|
+
| `theme` | `'light'` \| `'dark'` | 主题类型 | `'light'` |
|
|
201
|
+
| `plugins` | `IMarkdownPlugin[]` | 插件配置 | `[]` |
|
|
202
|
+
| `math` | [IMarkdownMath](#IMarkdownMath) | 数学公式配置 | `{ splitSymbol: 'dollar' }` |
|
|
203
|
+
| `onEnd` | `(data: EndData) => void` | 打字结束回调 | - |
|
|
204
|
+
| `onStart` | `(data: StartData) => void` | 打字开始回调 | - |
|
|
205
|
+
| `onTypedChar` | `(data: `[ITypedChar](#ITypedChar)`) => void` | 每字符打字回调 | - |
|
|
206
|
+
| `disableTyping` | `boolean` | 禁用打字动画效果 | `false` |
|
|
207
|
+
|
|
208
|
+
> 注意: 如果当在打字中 `disableTyping`从 `true` 变为 `false`,则在下一个打字触发时,会把剩下的所有字一次性显示
|
|
190
209
|
|
|
191
210
|
### ITypedChar
|
|
192
211
|
|
|
@@ -216,7 +235,16 @@ React 19 带来了许多激动人心的新特性:
|
|
|
216
235
|
| `type` | `'buildIn'` \| `'custom'` | 插件类型 | - |
|
|
217
236
|
| `id` | `any` | 插件唯一标识 | - |
|
|
218
237
|
|
|
219
|
-
###
|
|
238
|
+
### 组件暴露的方法
|
|
239
|
+
|
|
240
|
+
#### 默认导出 DsMarkdown
|
|
241
|
+
|
|
242
|
+
| 方法 | 参数 | 说明 |
|
|
243
|
+
| -------- | ---- | ------------ |
|
|
244
|
+
| `stop` | - | 暂停打字动画 |
|
|
245
|
+
| `resume` | - | 恢复打字动画 |
|
|
246
|
+
|
|
247
|
+
#### MarkdownCMD 暴露的方法
|
|
220
248
|
|
|
221
249
|
| 方法 | 参数 | 说明 |
|
|
222
250
|
| ----------------- | ------------------------------------------- | ------------------ |
|
|
@@ -237,7 +265,9 @@ markdownRef.current?.resume(); // 恢复动画
|
|
|
237
265
|
|
|
238
266
|
## 🧮 数学公式使用指南
|
|
239
267
|
|
|
240
|
-
[
|
|
268
|
+
[DEMO1:勾股定理](https://stackblitz.com/edit/vitejs-vite-z94syu8j?file=src%2FApp.tsx)
|
|
269
|
+
|
|
270
|
+
[DEMO2:题目解答](https://stackblitz.com/edit/vitejs-vite-xk9lxagc?file=README.md)
|
|
241
271
|
|
|
242
272
|
### 基本语法
|
|
243
273
|
|
|
@@ -9,7 +9,7 @@ const index_js_1 = __importDefault(require("../components/HighReactMarkdown/inde
|
|
|
9
9
|
const classnames_1 = __importDefault(require("classnames"));
|
|
10
10
|
const constant_js_1 = require("../constant.js");
|
|
11
11
|
const useTypingTask_js_1 = require("../hooks/useTypingTask.js");
|
|
12
|
-
const MarkdownCMD = (0, react_1.forwardRef)(({ interval = 30, onEnd, onStart, onTypedChar, timerType = 'setTimeout', theme = 'light', math, plugins }, ref) => {
|
|
12
|
+
const MarkdownCMD = (0, react_1.forwardRef)(({ interval = 30, onEnd, onStart, onTypedChar, timerType = 'setTimeout', theme = 'light', math, plugins, disableTyping = false }, ref) => {
|
|
13
13
|
/** 当前需要打字的内容 */
|
|
14
14
|
const charsRef = (0, react_1.useRef)([]);
|
|
15
15
|
/**
|
|
@@ -30,9 +30,9 @@ const MarkdownCMD = (0, react_1.forwardRef)(({ interval = 30, onEnd, onStart, on
|
|
|
30
30
|
},
|
|
31
31
|
allLength: 0,
|
|
32
32
|
});
|
|
33
|
-
const [, setUpdate] = (0, react_1.useState)(
|
|
33
|
+
const [, setUpdate] = (0, react_1.useState)(0);
|
|
34
34
|
const triggerUpdate = () => {
|
|
35
|
-
setUpdate((prev) =>
|
|
35
|
+
setUpdate((prev) => prev + 1);
|
|
36
36
|
};
|
|
37
37
|
/**
|
|
38
38
|
* 处理字符显示逻辑
|
|
@@ -58,11 +58,13 @@ const MarkdownCMD = (0, react_1.forwardRef)(({ interval = 30, onEnd, onStart, on
|
|
|
58
58
|
onTypedChar,
|
|
59
59
|
processCharDisplay,
|
|
60
60
|
wholeContentRef,
|
|
61
|
+
disableTyping,
|
|
62
|
+
triggerUpdate,
|
|
61
63
|
});
|
|
62
64
|
/**
|
|
63
65
|
* 内部推送处理逻辑
|
|
64
66
|
*/
|
|
65
|
-
const
|
|
67
|
+
const processHasTypingPush = (content, answerType) => {
|
|
66
68
|
if (content.length === 0) {
|
|
67
69
|
return;
|
|
68
70
|
}
|
|
@@ -82,6 +84,11 @@ const MarkdownCMD = (0, react_1.forwardRef)(({ interval = 30, onEnd, onStart, on
|
|
|
82
84
|
typingTask.start();
|
|
83
85
|
}
|
|
84
86
|
};
|
|
87
|
+
const processNoTypingPush = (content, answerType) => {
|
|
88
|
+
wholeContentRef.current[answerType].content += content;
|
|
89
|
+
wholeContentRef.current[answerType].length += content.length;
|
|
90
|
+
triggerUpdate();
|
|
91
|
+
};
|
|
85
92
|
(0, react_1.useImperativeHandle)(ref, () => ({
|
|
86
93
|
/**
|
|
87
94
|
* 添加内容
|
|
@@ -89,7 +96,11 @@ const MarkdownCMD = (0, react_1.forwardRef)(({ interval = 30, onEnd, onStart, on
|
|
|
89
96
|
* @param answerType 回答类型 {AnswerType}
|
|
90
97
|
*/
|
|
91
98
|
push: (content, answerType) => {
|
|
92
|
-
|
|
99
|
+
if (disableTyping) {
|
|
100
|
+
processNoTypingPush(content, answerType);
|
|
101
|
+
return;
|
|
102
|
+
}
|
|
103
|
+
processHasTypingPush(content, answerType);
|
|
93
104
|
},
|
|
94
105
|
/**
|
|
95
106
|
* 清除打字任务
|
|
@@ -98,17 +109,11 @@ const MarkdownCMD = (0, react_1.forwardRef)(({ interval = 30, onEnd, onStart, on
|
|
|
98
109
|
typingTask.stop();
|
|
99
110
|
typingTask.typedIsManualStopRef.current = false;
|
|
100
111
|
charsRef.current = [];
|
|
101
|
-
wholeContentRef.current =
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
answer: {
|
|
107
|
-
content: '',
|
|
108
|
-
length: 0,
|
|
109
|
-
},
|
|
110
|
-
allLength: 0,
|
|
111
|
-
};
|
|
112
|
+
wholeContentRef.current.thinking.content = '';
|
|
113
|
+
wholeContentRef.current.thinking.length = 0;
|
|
114
|
+
wholeContentRef.current.answer.content = '';
|
|
115
|
+
wholeContentRef.current.answer.length = 0;
|
|
116
|
+
wholeContentRef.current.allLength = 0;
|
|
112
117
|
isWholeTypedEndRef.current = false;
|
|
113
118
|
charIndexRef.current = 0;
|
|
114
119
|
triggerUpdate();
|
|
@@ -139,7 +144,8 @@ const MarkdownCMD = (0, react_1.forwardRef)(({ interval = 30, onEnd, onStart, on
|
|
|
139
144
|
*/
|
|
140
145
|
}));
|
|
141
146
|
const getParagraphs = (answerType) => {
|
|
142
|
-
|
|
147
|
+
const content = wholeContentRef.current[answerType].content || '';
|
|
148
|
+
return ((0, jsx_runtime_1.jsx)("div", { className: `ds-markdown-paragraph ds-typed-${answerType}`, children: (0, jsx_runtime_1.jsx)(index_js_1.default, { theme: theme, math: math, plugins: plugins, children: content }) }));
|
|
143
149
|
};
|
|
144
150
|
return ((0, jsx_runtime_1.jsxs)("div", { className: (0, classnames_1.default)({
|
|
145
151
|
'ds-markdown': true,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/MarkdownCMD/index.tsx"],"names":[],"mappings":";;;;;;AAAA,iCAA0E;AAE1E,wFAAyE;AACzE,4DAAoC;AAEpC,gDAAyC;AACzC,gEAA0D;AAI1D,MAAM,WAAW,GAAG,IAAA,kBAAU,
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/MarkdownCMD/index.tsx"],"names":[],"mappings":"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"}
|
package/dist/cjs/defined.d.ts
CHANGED
|
@@ -52,8 +52,8 @@ export interface MarkdownProps {
|
|
|
52
52
|
timerType?: 'setTimeout' | 'requestAnimationFrame';
|
|
53
53
|
/** 打字机效果间隔时间 */
|
|
54
54
|
interval: number;
|
|
55
|
-
/**
|
|
56
|
-
|
|
55
|
+
/** 是否关闭打字机效果 */
|
|
56
|
+
disableTyping?: boolean;
|
|
57
57
|
/** 打字完成后回调, */
|
|
58
58
|
onEnd?: (data?: {
|
|
59
59
|
str?: string;
|
|
@@ -71,6 +71,7 @@ export interface MarkdownProps {
|
|
|
71
71
|
theme?: Theme;
|
|
72
72
|
/** 数学公式配置 */
|
|
73
73
|
math?: IMarkdownMath;
|
|
74
|
+
/** 插件配置 */
|
|
74
75
|
plugins?: IMarkdownPlugin[];
|
|
75
76
|
}
|
|
76
77
|
export interface IMarkdownPlugin {
|
|
@@ -17,6 +17,8 @@ interface UseTypingTaskOptions {
|
|
|
17
17
|
onTypedChar?: (data?: ITypedChar) => void;
|
|
18
18
|
processCharDisplay: (char: IChar) => void;
|
|
19
19
|
wholeContentRef: React.RefObject<IWholeContent>;
|
|
20
|
+
disableTyping: boolean;
|
|
21
|
+
triggerUpdate: () => void;
|
|
20
22
|
}
|
|
21
23
|
export interface TypingTaskController {
|
|
22
24
|
start: () => void;
|
|
@@ -3,7 +3,7 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
|
|
3
3
|
exports.useTypingTask = void 0;
|
|
4
4
|
const react_1 = require("react");
|
|
5
5
|
const useTypingTask = (options) => {
|
|
6
|
-
const { timerType = 'setTimeout', interval, charsRef, onEnd, onStart, onTypedChar, processCharDisplay, wholeContentRef } = options;
|
|
6
|
+
const { timerType = 'setTimeout', interval, charsRef, onEnd, onStart, onTypedChar, processCharDisplay, wholeContentRef, disableTyping, triggerUpdate } = options;
|
|
7
7
|
/** 是否卸载 */
|
|
8
8
|
const isUnmountRef = (0, react_1.useRef)(false);
|
|
9
9
|
/** 是否正在打字 */
|
|
@@ -16,6 +16,8 @@ const useTypingTask = (options) => {
|
|
|
16
16
|
const typedCharsRef = (0, react_1.useRef)(undefined);
|
|
17
17
|
// 是否主动调用 stop 方法
|
|
18
18
|
const typedIsManualStopRef = (0, react_1.useRef)(false);
|
|
19
|
+
const disableTypingRef = (0, react_1.useRef)(disableTyping);
|
|
20
|
+
disableTypingRef.current = disableTyping;
|
|
19
21
|
const getChars = () => {
|
|
20
22
|
return charsRef.current;
|
|
21
23
|
};
|
|
@@ -74,7 +76,7 @@ const useTypingTask = (options) => {
|
|
|
74
76
|
}
|
|
75
77
|
onEnd({
|
|
76
78
|
str: typedCharsRef.current?.typedContent,
|
|
77
|
-
answerType: typedCharsRef.current?.answerType,
|
|
79
|
+
answerType: typedCharsRef.current?.answerType || 'answer',
|
|
78
80
|
manual: data?.manual ?? false,
|
|
79
81
|
});
|
|
80
82
|
};
|
|
@@ -132,10 +134,54 @@ const useTypingTask = (options) => {
|
|
|
132
134
|
startTimeoutMode();
|
|
133
135
|
}
|
|
134
136
|
};
|
|
137
|
+
/** 打字机打完所有字符 */
|
|
138
|
+
function typingRemainAll() {
|
|
139
|
+
const chars = getChars();
|
|
140
|
+
const thinkingCharsStr = chars
|
|
141
|
+
.filter((char) => char.answerType === 'thinking')
|
|
142
|
+
.map((char) => char.content)
|
|
143
|
+
.join('');
|
|
144
|
+
const answerCharsStr = chars
|
|
145
|
+
.filter((char) => char.answerType === 'answer')
|
|
146
|
+
.map((char) => char.content)
|
|
147
|
+
.join('');
|
|
148
|
+
if (thinkingCharsStr) {
|
|
149
|
+
onTypedChar?.({
|
|
150
|
+
currentIndex: wholeContentRef.current.thinking.length,
|
|
151
|
+
currentChar: thinkingCharsStr,
|
|
152
|
+
answerType: 'thinking',
|
|
153
|
+
prevStr: typedCharsRef.current?.prevStr || '',
|
|
154
|
+
percent: 100,
|
|
155
|
+
});
|
|
156
|
+
}
|
|
157
|
+
if (answerCharsStr) {
|
|
158
|
+
onTypedChar?.({
|
|
159
|
+
currentIndex: wholeContentRef.current.answer.length,
|
|
160
|
+
currentChar: answerCharsStr,
|
|
161
|
+
answerType: 'answer',
|
|
162
|
+
prevStr: typedCharsRef.current?.prevStr || '',
|
|
163
|
+
percent: 100,
|
|
164
|
+
});
|
|
165
|
+
}
|
|
166
|
+
wholeContentRef.current.thinking.content += thinkingCharsStr;
|
|
167
|
+
wholeContentRef.current.thinking.length += thinkingCharsStr.length;
|
|
168
|
+
wholeContentRef.current.answer.content += answerCharsStr;
|
|
169
|
+
wholeContentRef.current.answer.length += answerCharsStr.length;
|
|
170
|
+
wholeContentRef.current.allLength += thinkingCharsStr.length + answerCharsStr.length;
|
|
171
|
+
charsRef.current = [];
|
|
172
|
+
isTypedRef.current = false;
|
|
173
|
+
triggerOnEnd();
|
|
174
|
+
triggerUpdate();
|
|
175
|
+
}
|
|
135
176
|
/** requestAnimationFrame 模式 */
|
|
136
177
|
const startAnimationFrameMode = () => {
|
|
137
178
|
let lastFrameTime = 0;
|
|
138
179
|
const frameLoop = (currentTime) => {
|
|
180
|
+
// 如果关闭打字机效果,则打完所有字符
|
|
181
|
+
if (disableTypingRef.current) {
|
|
182
|
+
typingRemainAll();
|
|
183
|
+
return;
|
|
184
|
+
}
|
|
139
185
|
const chars = getChars();
|
|
140
186
|
if (isUnmountRef.current)
|
|
141
187
|
return;
|
|
@@ -199,6 +245,11 @@ const useTypingTask = (options) => {
|
|
|
199
245
|
timerRef.current = setTimeout(startTyped, interval);
|
|
200
246
|
};
|
|
201
247
|
const startTyped = (isStartPoint = false) => {
|
|
248
|
+
// 如果关闭打字机效果,则打完所有字符
|
|
249
|
+
if (disableTypingRef.current) {
|
|
250
|
+
typingRemainAll();
|
|
251
|
+
return;
|
|
252
|
+
}
|
|
202
253
|
const chars = getChars();
|
|
203
254
|
if (isUnmountRef.current)
|
|
204
255
|
return;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"useTypingTask.js","sourceRoot":"","sources":["../../../src/hooks/useTypingTask.ts"],"names":[],"mappings":";;;AAAA,iCAA0C;
|
|
1
|
+
{"version":3,"file":"useTypingTask.js","sourceRoot":"","sources":["../../../src/hooks/useTypingTask.ts"],"names":[],"mappings":";;;AAAA,iCAA0C;AA0BnC,MAAM,aAAa,GAAG,CAAC,OAA6B,EAAwB,EAAE;IACnF,MAAM,EAAE,SAAS,GAAG,YAAY,EAAE,QAAQ,EAAE,QAAQ,EAAE,KAAK,EAAE,OAAO,EAAE,WAAW,EAAE,kBAAkB,EAAE,eAAe,EAAE,aAAa,EAAE,aAAa,EAAE,GAAG,OAAO,CAAC;IACjK,WAAW;IACX,MAAM,YAAY,GAAG,IAAA,cAAM,EAAC,KAAK,CAAC,CAAC;IACnC,aAAa;IACb,MAAM,UAAU,GAAG,IAAA,cAAM,EAAC,KAAK,CAAC,CAAC;IACjC,YAAY;IACZ,MAAM,iBAAiB,GAAG,IAAA,cAAM,EAAgB,IAAI,CAAC,CAAC;IACtD,kBAAkB;IAClB,MAAM,QAAQ,GAAG,IAAA,cAAM,EAAwB,IAAI,CAAC,CAAC;IACrD,WAAW;IACX,MAAM,aAAa,GAAG,IAAA,cAAM,EAAgF,SAAS,CAAC,CAAC;IACvH,iBAAiB;IACjB,MAAM,oBAAoB,GAAG,IAAA,cAAM,EAAC,KAAK,CAAC,CAAC;IAE3C,MAAM,gBAAgB,GAAG,IAAA,cAAM,EAAC,aAAa,CAAC,CAAC;IAC/C,gBAAgB,CAAC,OAAO,GAAG,aAAa,CAAC;IAEzC,MAAM,QAAQ,GAAG,GAAG,EAAE;QACpB,OAAO,QAAQ,CAAC,OAAO,CAAC;IAC1B,CAAC,CAAC;IAEF,IAAA,iBAAS,EAAC,GAAG,EAAE;QACb,YAAY,CAAC,OAAO,GAAG,KAAK,CAAC;QAE7B,OAAO,GAAG,EAAE;YACV,YAAY,CAAC,OAAO,GAAG,IAAI,CAAC;QAC9B,CAAC,CAAC;IACJ,CAAC,EAAE,EAAE,CAAC,CAAC;IAEP;;;;OAIG;IACH,MAAM,gBAAgB,GAAG,CAAC,IAAW,EAAE,EAAE;QACvC,IAAI,OAAO,GAAG,EAAE,CAAC;QACjB,IAAI,CAAC,aAAa,CAAC,OAAO,IAAI,aAAa,CAAC,OAAO,CAAC,UAAU,KAAK,IAAI,CAAC,UAAU,EAAE,CAAC;YACnF,aAAa,CAAC,OAAO,GAAG;gBACtB,YAAY,EAAE,IAAI,CAAC,OAAO;gBAC1B,UAAU,EAAE,IAAI,CAAC,UAAU;gBAC3B,OAAO,EAAE,EAAE;aACZ,CAAC;QACJ,CAAC;aAAM,CAAC;YACN,OAAO,GAAG,aAAa,CAAC,OAAO,CAAC,YAAY,CAAC;YAC7C,aAAa,CAAC,OAAO,CAAC,YAAY,IAAI,IAAI,CAAC,OAAO,CAAC;YACnD,aAAa,CAAC,OAAO,CAAC,OAAO,GAAG,OAAO,CAAC;QAC1C,CAAC;QAED,OAAO;YACL,OAAO;YACP,OAAO,EAAE,aAAa,CAAC,OAAO,EAAE,YAAY,IAAI,EAAE;SACnD,CAAC;IACJ,CAAC,CAAC;IAEF;;;OAGG;IACH,MAAM,cAAc,GAAG,CAAC,IAAW,EAAE,EAAE;QACrC,IAAI,CAAC,OAAO,EAAE,CAAC;YACb,OAAO;QACT,CAAC;QACD,MAAM,EAAE,OAAO,EAAE,GAAG,gBAAgB,CAAC,IAAI,CAAC,CAAC;QAC3C,OAAO,CAAC;YACN,YAAY,EAAE,OAAO,CAAC,MAAM;YAC5B,WAAW,EAAE,IAAI,CAAC,OAAO;YACzB,UAAU,EAAE,IAAI,CAAC,UAAU;YAC3B,OAAO;SACR,CAAC,CAAC;IACL,CAAC,CAAC;IAEF;;OAEG;IACH,MAAM,YAAY,GAAG,CAAC,IAA2B,EAAE,EAAE;QACnD,IAAI,CAAC,KAAK,EAAE,CAAC;YACX,OAAO;QACT,CAAC;QAED,KAAK,CAAC;YACJ,GAAG,EAAE,aAAa,CAAC,OAAO,EAAE,YAAY;YACxC,UAAU,EAAE,aAAa,CAAC,OAAO,EAAE,UAAU,IAAI,QAAQ;YACzD,MAAM,EAAE,IAAI,EAAE,MAAM,IAAI,KAAK;SAC9B,CAAC,CAAC;IACL,CAAC,CAAC;IAEF;;;;OAIG;IACH,MAAM,kBAAkB,GAAG,CAAC,IAAW,EAAE,YAAY,GAAG,KAAK,EAAE,EAAE;QAC/D,IAAI,CAAC,YAAY,EAAE,CAAC;YAClB,gBAAgB,CAAC,IAAI,CAAC,CAAC;QACzB,CAAC;QACD,IAAI,CAAC,WAAW,EAAE,CAAC;YACjB,OAAO;QACT,CAAC;QAED,MAAM,EAAE,UAAU,EAAE,OAAO,EAAE,KAAK,EAAE,GAAG,IAAI,CAAC;QAE5C,MAAM,SAAS,GAAG,eAAe,CAAC,OAAO,CAAC,SAAS,CAAC;QAEpD,MAAM,OAAO,GAAG,CAAC,CAAC,IAAI,CAAC,KAAK,GAAG,CAAC,CAAC,GAAG,SAAS,CAAC,GAAG,GAAG,CAAC;QAErD,WAAW,CAAC;YACV,YAAY,EAAE,KAAK;YACnB,WAAW,EAAE,OAAO;YACpB,UAAU,EAAE,UAAU;YACtB,OAAO,EAAE,aAAa,CAAC,OAAO,EAAE,OAAO,IAAI,EAAE;YAC7C,OAAO;SACR,CAAC,CAAC;IACL,CAAC,CAAC;IAEF,YAAY;IACZ,MAAM,UAAU,GAAG,GAAG,EAAE;QACtB,2BAA2B;QAC3B,IAAI,iBAAiB,CAAC,OAAO,EAAE,CAAC;YAC9B,oBAAoB,CAAC,iBAAiB,CAAC,OAAO,CAAC,CAAC;YAChD,iBAAiB,CAAC,OAAO,GAAG,IAAI,CAAC;QACnC,CAAC;QAED,qCAAqC;QACrC,IAAI,QAAQ,CAAC,OAAO,EAAE,CAAC;YACrB,YAAY,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC;YAC/B,QAAQ,CAAC,OAAO,GAAG,IAAI,CAAC;QAC1B,CAAC;QAED,UAAU,CAAC,OAAO,GAAG,KAAK,CAAC;QAC3B,aAAa,CAAC,OAAO,GAAG,SAAS,CAAC;IACpC,CAAC,CAAC;IAEF,aAAa;IACb,MAAM,cAAc,GAAG,GAAG,EAAE;QAC1B,8BAA8B;QAC9B,IAAI,oBAAoB,CAAC,OAAO,EAAE,CAAC;YACjC,OAAO;QACT,CAAC;QAED,IAAI,UAAU,CAAC,OAAO,EAAE,CAAC;YACvB,OAAO;QACT,CAAC;QAED,IAAI,SAAS,KAAK,uBAAuB,EAAE,CAAC;YAC1C,uBAAuB,EAAE,CAAC;QAC5B,CAAC;aAAM,CAAC;YACN,gBAAgB,EAAE,CAAC;QACrB,CAAC;IACH,CAAC,CAAC;IAEF,gBAAgB;IAChB,SAAS,eAAe;QACtB,MAAM,KAAK,GAAG,QAAQ,EAAE,CAAC;QACzB,MAAM,gBAAgB,GAAG,KAAK;aAC3B,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,UAAU,KAAK,UAAU,CAAC;aAChD,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,OAAO,CAAC;aAC3B,IAAI,CAAC,EAAE,CAAC,CAAC;QACZ,MAAM,cAAc,GAAG,KAAK;aACzB,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,UAAU,KAAK,QAAQ,CAAC;aAC9C,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,OAAO,CAAC;aAC3B,IAAI,CAAC,EAAE,CAAC,CAAC;QAEZ,IAAI,gBAAgB,EAAE,CAAC;YACrB,WAAW,EAAE,CAAC;gBACZ,YAAY,EAAE,eAAe,CAAC,OAAO,CAAC,QAAQ,CAAC,MAAM;gBACrD,WAAW,EAAE,gBAAgB;gBAC7B,UAAU,EAAE,UAAU;gBACtB,OAAO,EAAE,aAAa,CAAC,OAAO,EAAE,OAAO,IAAI,EAAE;gBAC7C,OAAO,EAAE,GAAG;aACb,CAAC,CAAC;QACL,CAAC;QAED,IAAI,cAAc,EAAE,CAAC;YACnB,WAAW,EAAE,CAAC;gBACZ,YAAY,EAAE,eAAe,CAAC,OAAO,CAAC,MAAM,CAAC,MAAM;gBACnD,WAAW,EAAE,cAAc;gBAC3B,UAAU,EAAE,QAAQ;gBACpB,OAAO,EAAE,aAAa,CAAC,OAAO,EAAE,OAAO,IAAI,EAAE;gBAC7C,OAAO,EAAE,GAAG;aACb,CAAC,CAAC;QACL,CAAC;QAED,eAAe,CAAC,OAAO,CAAC,QAAQ,CAAC,OAAO,IAAI,gBAAgB,CAAC;QAC7D,eAAe,CAAC,OAAO,CAAC,QAAQ,CAAC,MAAM,IAAI,gBAAgB,CAAC,MAAM,CAAC;QACnE,eAAe,CAAC,OAAO,CAAC,MAAM,CAAC,OAAO,IAAI,cAAc,CAAC;QACzD,eAAe,CAAC,OAAO,CAAC,MAAM,CAAC,MAAM,IAAI,cAAc,CAAC,MAAM,CAAC;QAC/D,eAAe,CAAC,OAAO,CAAC,SAAS,IAAI,gBAAgB,CAAC,MAAM,GAAG,cAAc,CAAC,MAAM,CAAC;QACrF,QAAQ,CAAC,OAAO,GAAG,EAAE,CAAC;QACtB,UAAU,CAAC,OAAO,GAAG,KAAK,CAAC;QAE3B,YAAY,EAAE,CAAC;QACf,aAAa,EAAE,CAAC;IAClB,CAAC;IAED,+BAA+B;IAC/B,MAAM,uBAAuB,GAAG,GAAG,EAAE;QACnC,IAAI,aAAa,GAAG,CAAC,CAAC;QAEtB,MAAM,SAAS,GAAG,CAAC,WAAmB,EAAE,EAAE;YACxC,oBAAoB;YACpB,IAAI,gBAAgB,CAAC,OAAO,EAAE,CAAC;gBAC7B,eAAe,EAAE,CAAC;gBAClB,OAAO;YACT,CAAC;YACD,MAAM,KAAK,GAAG,QAAQ,EAAE,CAAC;YAEzB,IAAI,YAAY,CAAC,OAAO;gBAAE,OAAO;YAEjC,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;gBACvB,kBAAkB,EAAE,CAAC;gBACrB,OAAO;YACT,CAAC;YAED,gBAAgB;YAChB,IAAI,aAAa,KAAK,CAAC,EAAE,CAAC;gBACxB,aAAa,GAAG,WAAW,CAAC;YAC9B,CAAC;YAED,MAAM,SAAS,GAAG,WAAW,GAAG,aAAa,CAAC;YAC9C,MAAM,WAAW,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,KAAK,CAAC,SAAS,GAAG,QAAQ,CAAC,CAAC,CAAC;YAClE,MAAM,iBAAiB,GAAG,IAAI,CAAC,GAAG,CAAC,WAAW,EAAE,KAAK,CAAC,MAAM,CAAC,CAAC;YAE9D,OAAO;YACP,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,iBAAiB,EAAE,CAAC,EAAE,EAAE,CAAC;gBAC3C,MAAM,IAAI,GAAG,KAAK,CAAC,KAAK,EAAE,CAAC;gBAC3B,IAAI,IAAI,KAAK,SAAS;oBAAE,MAAM;gBAE9B,IAAI,CAAC,UAAU,CAAC,OAAO,EAAE,CAAC;oBACxB,UAAU,CAAC,OAAO,GAAG,IAAI,CAAC;oBAC1B,cAAc,CAAC,IAAI,CAAC,CAAC;oBACrB,kBAAkB,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;gBACjC,CAAC;qBAAM,CAAC;oBACN,kBAAkB,CAAC,IAAI,CAAC,CAAC;gBAC3B,CAAC;gBACD,kBAAkB,CAAC,IAAI,CAAC,CAAC;YAC3B,CAAC;YAED,aAAa,GAAG,WAAW,CAAC;YAE5B,QAAQ;YACR,IAAI,KAAK,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;gBACrB,iBAAiB,CAAC,OAAO,GAAG,qBAAqB,CAAC,SAAS,CAAC,CAAC;YAC/D,CAAC;iBAAM,CAAC;gBACN,UAAU,CAAC,OAAO,GAAG,KAAK,CAAC;gBAC3B,YAAY,EAAE,CAAC;YACjB,CAAC;QACH,CAAC,CAAC;QAEF,iBAAiB,CAAC,OAAO,GAAG,qBAAqB,CAAC,SAAS,CAAC,CAAC;IAC/D,CAAC,CAAC;IAEF,cAAc;IACd,MAAM,kBAAkB,GAAG,CAAC,MAAM,GAAG,KAAK,EAAE,EAAE;QAC5C,UAAU,CAAC,OAAO,GAAG,KAAK,CAAC;QAC3B,IAAI,iBAAiB,CAAC,OAAO,EAAE,CAAC;YAC9B,oBAAoB,CAAC,iBAAiB,CAAC,OAAO,CAAC,CAAC;YAChD,iBAAiB,CAAC,OAAO,GAAG,IAAI,CAAC;QACnC,CAAC;QACD,IAAI,CAAC,MAAM,EAAE,CAAC;YACZ,YAAY,CAAC,EAAE,MAAM,EAAE,CAAC,CAAC;QAC3B,CAAC;IACH,CAAC,CAAC;IAEF,oBAAoB;IACpB,MAAM,gBAAgB,GAAG,GAAG,EAAE;QAC5B,MAAM,SAAS,GAAG,GAAG,EAAE;YACrB,MAAM,KAAK,GAAG,QAAQ,EAAE,CAAC;YACzB,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;gBACvB,WAAW,EAAE,CAAC;gBACd,OAAO;YACT,CAAC;YACD,QAAQ,CAAC,OAAO,GAAG,UAAU,CAAC,UAAU,EAAE,QAAQ,CAAC,CAAC;QACtD,CAAC,CAAC;QAEF,MAAM,UAAU,GAAG,CAAC,YAAY,GAAG,KAAK,EAAE,EAAE;YAC1C,oBAAoB;YACpB,IAAI,gBAAgB,CAAC,OAAO,EAAE,CAAC;gBAC7B,eAAe,EAAE,CAAC;gBAClB,OAAO;YACT,CAAC;YAED,MAAM,KAAK,GAAG,QAAQ,EAAE,CAAC;YACzB,IAAI,YAAY,CAAC,OAAO;gBAAE,OAAO;YAEjC,UAAU,CAAC,OAAO,GAAG,IAAI,CAAC;YAC1B,MAAM,IAAI,GAAG,KAAK,CAAC,KAAK,EAAE,CAAC;YAE3B,IAAI,IAAI,KAAK,SAAS,EAAE,CAAC;gBACvB,WAAW,EAAE,CAAC;gBACd,OAAO;YACT,CAAC;YAED,IAAI,YAAY,EAAE,CAAC;gBACjB,cAAc,CAAC,IAAI,CAAC,CAAC;gBACrB,kBAAkB,CAAC,IAAI,EAAE,YAAY,CAAC,CAAC;YACzC,CAAC;iBAAM,CAAC;gBACN,kBAAkB,CAAC,IAAI,CAAC,CAAC;YAC3B,CAAC;YAED,kBAAkB,CAAC,IAAI,CAAC,CAAC;YACzB,SAAS,EAAE,CAAC;QACd,CAAC,CAAC;QAEF,UAAU,CAAC,IAAI,CAAC,CAAC;IACnB,CAAC,CAAC;IAEF,aAAa;IACb,MAAM,WAAW,GAAG,GAAG,EAAE;QACvB,UAAU,CAAC,OAAO,GAAG,KAAK,CAAC;QAC3B,IAAI,QAAQ,CAAC,OAAO,EAAE,CAAC;YACrB,YAAY,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC;YAC/B,QAAQ,CAAC,OAAO,GAAG,IAAI,CAAC;QAC1B,CAAC;QACD,YAAY,EAAE,CAAC;IACjB,CAAC,CAAC;IAEF,MAAM,QAAQ,GAAG,GAAG,EAAE;QACpB,oBAAoB,CAAC,OAAO,GAAG,IAAI,CAAC;QACpC,IAAI,SAAS,KAAK,uBAAuB,EAAE,CAAC;YAC1C,kBAAkB,EAAE,CAAC;QACvB,CAAC;aAAM,CAAC;YACN,WAAW,EAAE,CAAC;QAChB,CAAC;IACH,CAAC,CAAC;IAEF,SAAS,gBAAgB;QACvB,oBAAoB,CAAC,OAAO,GAAG,KAAK,CAAC;QACrC,cAAc,EAAE,CAAC;IACnB,CAAC;IAED,OAAO;QACL,KAAK,EAAE,cAAc;QACrB,IAAI,EAAE,QAAQ;QACd,MAAM,EAAE,gBAAgB;QACxB,KAAK,EAAE,GAAG,EAAE;YACV,UAAU,EAAE,CAAC;YACb,aAAa,CAAC,OAAO,GAAG,SAAS,CAAC;QACpC,CAAC;QACD,QAAQ,EAAE,GAAG,EAAE,CAAC,UAAU,CAAC,OAAO;QAClC,oBAAoB;KACrB,CAAC;AACJ,CAAC,CAAC;AAtVW,QAAA,aAAa,iBAsVxB"}
|
|
@@ -4,7 +4,7 @@ import HighReactMarkdown from '../components/HighReactMarkdown/index.js';
|
|
|
4
4
|
import classNames from 'classnames';
|
|
5
5
|
import { __DEV__ } from '../constant.js';
|
|
6
6
|
import { useTypingTask } from '../hooks/useTypingTask.js';
|
|
7
|
-
const MarkdownCMD = forwardRef(({ interval = 30, onEnd, onStart, onTypedChar, timerType = 'setTimeout', theme = 'light', math, plugins }, ref) => {
|
|
7
|
+
const MarkdownCMD = forwardRef(({ interval = 30, onEnd, onStart, onTypedChar, timerType = 'setTimeout', theme = 'light', math, plugins, disableTyping = false }, ref) => {
|
|
8
8
|
/** 当前需要打字的内容 */
|
|
9
9
|
const charsRef = useRef([]);
|
|
10
10
|
/**
|
|
@@ -25,9 +25,9 @@ const MarkdownCMD = forwardRef(({ interval = 30, onEnd, onStart, onTypedChar, ti
|
|
|
25
25
|
},
|
|
26
26
|
allLength: 0,
|
|
27
27
|
});
|
|
28
|
-
const [, setUpdate] = useState(
|
|
28
|
+
const [, setUpdate] = useState(0);
|
|
29
29
|
const triggerUpdate = () => {
|
|
30
|
-
setUpdate((prev) =>
|
|
30
|
+
setUpdate((prev) => prev + 1);
|
|
31
31
|
};
|
|
32
32
|
/**
|
|
33
33
|
* 处理字符显示逻辑
|
|
@@ -53,11 +53,13 @@ const MarkdownCMD = forwardRef(({ interval = 30, onEnd, onStart, onTypedChar, ti
|
|
|
53
53
|
onTypedChar,
|
|
54
54
|
processCharDisplay,
|
|
55
55
|
wholeContentRef,
|
|
56
|
+
disableTyping,
|
|
57
|
+
triggerUpdate,
|
|
56
58
|
});
|
|
57
59
|
/**
|
|
58
60
|
* 内部推送处理逻辑
|
|
59
61
|
*/
|
|
60
|
-
const
|
|
62
|
+
const processHasTypingPush = (content, answerType) => {
|
|
61
63
|
if (content.length === 0) {
|
|
62
64
|
return;
|
|
63
65
|
}
|
|
@@ -77,6 +79,11 @@ const MarkdownCMD = forwardRef(({ interval = 30, onEnd, onStart, onTypedChar, ti
|
|
|
77
79
|
typingTask.start();
|
|
78
80
|
}
|
|
79
81
|
};
|
|
82
|
+
const processNoTypingPush = (content, answerType) => {
|
|
83
|
+
wholeContentRef.current[answerType].content += content;
|
|
84
|
+
wholeContentRef.current[answerType].length += content.length;
|
|
85
|
+
triggerUpdate();
|
|
86
|
+
};
|
|
80
87
|
useImperativeHandle(ref, () => ({
|
|
81
88
|
/**
|
|
82
89
|
* 添加内容
|
|
@@ -84,7 +91,11 @@ const MarkdownCMD = forwardRef(({ interval = 30, onEnd, onStart, onTypedChar, ti
|
|
|
84
91
|
* @param answerType 回答类型 {AnswerType}
|
|
85
92
|
*/
|
|
86
93
|
push: (content, answerType) => {
|
|
87
|
-
|
|
94
|
+
if (disableTyping) {
|
|
95
|
+
processNoTypingPush(content, answerType);
|
|
96
|
+
return;
|
|
97
|
+
}
|
|
98
|
+
processHasTypingPush(content, answerType);
|
|
88
99
|
},
|
|
89
100
|
/**
|
|
90
101
|
* 清除打字任务
|
|
@@ -93,17 +104,11 @@ const MarkdownCMD = forwardRef(({ interval = 30, onEnd, onStart, onTypedChar, ti
|
|
|
93
104
|
typingTask.stop();
|
|
94
105
|
typingTask.typedIsManualStopRef.current = false;
|
|
95
106
|
charsRef.current = [];
|
|
96
|
-
wholeContentRef.current =
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
answer: {
|
|
102
|
-
content: '',
|
|
103
|
-
length: 0,
|
|
104
|
-
},
|
|
105
|
-
allLength: 0,
|
|
106
|
-
};
|
|
107
|
+
wholeContentRef.current.thinking.content = '';
|
|
108
|
+
wholeContentRef.current.thinking.length = 0;
|
|
109
|
+
wholeContentRef.current.answer.content = '';
|
|
110
|
+
wholeContentRef.current.answer.length = 0;
|
|
111
|
+
wholeContentRef.current.allLength = 0;
|
|
107
112
|
isWholeTypedEndRef.current = false;
|
|
108
113
|
charIndexRef.current = 0;
|
|
109
114
|
triggerUpdate();
|
|
@@ -134,7 +139,8 @@ const MarkdownCMD = forwardRef(({ interval = 30, onEnd, onStart, onTypedChar, ti
|
|
|
134
139
|
*/
|
|
135
140
|
}));
|
|
136
141
|
const getParagraphs = (answerType) => {
|
|
137
|
-
|
|
142
|
+
const content = wholeContentRef.current[answerType].content || '';
|
|
143
|
+
return (_jsx("div", { className: `ds-markdown-paragraph ds-typed-${answerType}`, children: _jsx(HighReactMarkdown, { theme: theme, math: math, plugins: plugins, children: content }) }));
|
|
138
144
|
};
|
|
139
145
|
return (_jsxs("div", { className: classNames({
|
|
140
146
|
'ds-markdown': true,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/MarkdownCMD/index.tsx"],"names":[],"mappings":";AAAA,OAAO,EAAE,UAAU,EAAE,mBAAmB,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,OAAO,CAAC;AAE1E,OAAO,iBAAiB,MAAM,0CAA0C,CAAC;AACzE,OAAO,UAAU,MAAM,YAAY,CAAC;AAEpC,OAAO,EAAE,OAAO,EAAE,MAAM,gBAAgB,CAAC;AACzC,OAAO,EAAE,aAAa,EAAE,MAAM,2BAA2B,CAAC;AAI1D,MAAM,WAAW,GAAG,UAAU,
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/MarkdownCMD/index.tsx"],"names":[],"mappings":"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"}
|
package/dist/esm/defined.d.ts
CHANGED
|
@@ -52,8 +52,8 @@ export interface MarkdownProps {
|
|
|
52
52
|
timerType?: 'setTimeout' | 'requestAnimationFrame';
|
|
53
53
|
/** 打字机效果间隔时间 */
|
|
54
54
|
interval: number;
|
|
55
|
-
/**
|
|
56
|
-
|
|
55
|
+
/** 是否关闭打字机效果 */
|
|
56
|
+
disableTyping?: boolean;
|
|
57
57
|
/** 打字完成后回调, */
|
|
58
58
|
onEnd?: (data?: {
|
|
59
59
|
str?: string;
|
|
@@ -71,6 +71,7 @@ export interface MarkdownProps {
|
|
|
71
71
|
theme?: Theme;
|
|
72
72
|
/** 数学公式配置 */
|
|
73
73
|
math?: IMarkdownMath;
|
|
74
|
+
/** 插件配置 */
|
|
74
75
|
plugins?: IMarkdownPlugin[];
|
|
75
76
|
}
|
|
76
77
|
export interface IMarkdownPlugin {
|
|
@@ -17,6 +17,8 @@ interface UseTypingTaskOptions {
|
|
|
17
17
|
onTypedChar?: (data?: ITypedChar) => void;
|
|
18
18
|
processCharDisplay: (char: IChar) => void;
|
|
19
19
|
wholeContentRef: React.RefObject<IWholeContent>;
|
|
20
|
+
disableTyping: boolean;
|
|
21
|
+
triggerUpdate: () => void;
|
|
20
22
|
}
|
|
21
23
|
export interface TypingTaskController {
|
|
22
24
|
start: () => void;
|