ds-markdown 0.1.2-beta.1 → 0.1.2-beta.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/README.en.md +254 -28
- package/README.ja.md +49 -33
- package/README.ko.md +49 -28
- package/README.md +330 -28
- package/dist/cjs/Markdown/index.js +6 -0
- package/dist/cjs/Markdown/index.js.map +1 -1
- package/dist/cjs/MarkdownCMD/index.js +49 -12
- package/dist/cjs/MarkdownCMD/index.js.map +1 -1
- package/dist/cjs/defined.d.ts +22 -8
- package/dist/cjs/hooks/useTypingTask.d.ts +5 -6
- package/dist/cjs/hooks/useTypingTask.js +93 -68
- package/dist/cjs/hooks/useTypingTask.js.map +1 -1
- package/dist/esm/Markdown/index.js +6 -0
- package/dist/esm/Markdown/index.js.map +1 -1
- package/dist/esm/MarkdownCMD/index.js +49 -12
- package/dist/esm/MarkdownCMD/index.js.map +1 -1
- package/dist/esm/defined.d.ts +22 -8
- package/dist/esm/hooks/useTypingTask.d.ts +5 -6
- package/dist/esm/hooks/useTypingTask.js +93 -68
- package/dist/esm/hooks/useTypingTask.js.map +1 -1
- package/package.json +1 -1
package/dist/cjs/defined.d.ts
CHANGED
|
@@ -9,10 +9,6 @@ export type Theme = 'light' | 'dark';
|
|
|
9
9
|
export interface IChar {
|
|
10
10
|
content: string;
|
|
11
11
|
answerType: AnswerType;
|
|
12
|
-
/**
|
|
13
|
-
* split_segment 两个连续的段落,需要做分割
|
|
14
|
-
*/
|
|
15
|
-
contentType: 'space' | 'segment' | 'split_segment';
|
|
16
12
|
tokenId: number;
|
|
17
13
|
/** 字符索引 */
|
|
18
14
|
index: number;
|
|
@@ -46,6 +42,10 @@ export interface IOnTypedCharData {
|
|
|
46
42
|
}
|
|
47
43
|
export interface ITypedChar extends IOnTypedCharData {
|
|
48
44
|
percent: number;
|
|
45
|
+
currentStr: string;
|
|
46
|
+
}
|
|
47
|
+
export interface IBeforeTypedChar extends IOnTypedCharData {
|
|
48
|
+
percent: number;
|
|
49
49
|
}
|
|
50
50
|
export interface MarkdownBaseProps {
|
|
51
51
|
/** 计时类型: 支持setTimeout和requestAnimationFrame */
|
|
@@ -57,12 +57,11 @@ export interface MarkdownBaseProps {
|
|
|
57
57
|
/** 是否关闭打字机效果 */
|
|
58
58
|
disableTyping?: boolean;
|
|
59
59
|
/** 打字完成后回调, */
|
|
60
|
-
onEnd?: (data?:
|
|
61
|
-
str?: string;
|
|
62
|
-
answerType?: AnswerType;
|
|
63
|
-
}) => void;
|
|
60
|
+
onEnd?: (data?: IEndData) => void;
|
|
64
61
|
/** 开始打字回调 */
|
|
65
62
|
onStart?: (data?: IOnTypedCharData) => void;
|
|
63
|
+
/** 打字前回调 */
|
|
64
|
+
onBeforeTypedChar?: (data?: IBeforeTypedChar) => Promise<void>;
|
|
66
65
|
/**
|
|
67
66
|
* 打字机打完一个字符回调
|
|
68
67
|
* @param char 字符
|
|
@@ -75,6 +74,8 @@ export interface MarkdownBaseProps {
|
|
|
75
74
|
math?: IMarkdownMath;
|
|
76
75
|
/** 插件配置 */
|
|
77
76
|
plugins?: IMarkdownPlugin[];
|
|
77
|
+
/** 是否自动开启打字动画 */
|
|
78
|
+
autoStartTyping?: boolean;
|
|
78
79
|
}
|
|
79
80
|
export interface MarkdownProps extends MarkdownBaseProps {
|
|
80
81
|
children: string | undefined;
|
|
@@ -97,16 +98,20 @@ export interface IWholeContent {
|
|
|
97
98
|
thinking: {
|
|
98
99
|
content: string;
|
|
99
100
|
length: number;
|
|
101
|
+
prevLength: number;
|
|
100
102
|
};
|
|
101
103
|
answer: {
|
|
102
104
|
content: string;
|
|
103
105
|
length: number;
|
|
106
|
+
prevLength: number;
|
|
104
107
|
};
|
|
105
108
|
allLength: number;
|
|
106
109
|
}
|
|
107
110
|
export interface MarkdownBaseRef {
|
|
108
111
|
stop: () => void;
|
|
109
112
|
resume: () => void;
|
|
113
|
+
start: () => void;
|
|
114
|
+
restart: () => void;
|
|
110
115
|
}
|
|
111
116
|
/** Markdown 组件的ref 类型 */
|
|
112
117
|
export type MarkdownRef = MarkdownBaseRef;
|
|
@@ -116,3 +121,12 @@ export interface MarkdownCMDRef extends MarkdownBaseRef {
|
|
|
116
121
|
clear: () => void;
|
|
117
122
|
triggerWholeEnd: () => void;
|
|
118
123
|
}
|
|
124
|
+
export interface IEndData {
|
|
125
|
+
manual: boolean;
|
|
126
|
+
/** 回答字符串 */
|
|
127
|
+
answerStr: string;
|
|
128
|
+
/** 思考字符串 */
|
|
129
|
+
thinkingStr: string;
|
|
130
|
+
/** 打字机打过的字符串, 和answerStr 相同 */
|
|
131
|
+
str: string;
|
|
132
|
+
}
|
|
@@ -1,24 +1,22 @@
|
|
|
1
|
-
import { AnswerType, IChar, ITypedChar, IWholeContent, MarkdownProps } from '../defined.js';
|
|
1
|
+
import { AnswerType, IChar, ITypedChar, IWholeContent, MarkdownProps, IEndData, IBeforeTypedChar } from '../defined.js';
|
|
2
2
|
interface UseTypingTaskOptions {
|
|
3
3
|
timerType: MarkdownProps['timerType'];
|
|
4
4
|
interval: number;
|
|
5
5
|
charsRef: React.RefObject<IChar[]>;
|
|
6
|
-
onEnd?: (data?:
|
|
7
|
-
str?: string;
|
|
8
|
-
answerType?: AnswerType;
|
|
9
|
-
manual: boolean;
|
|
10
|
-
}) => void;
|
|
6
|
+
onEnd?: (data?: IEndData) => void;
|
|
11
7
|
onStart?: (data?: {
|
|
12
8
|
currentIndex: number;
|
|
13
9
|
currentChar: string;
|
|
14
10
|
answerType: AnswerType;
|
|
15
11
|
prevStr: string;
|
|
16
12
|
}) => void;
|
|
13
|
+
onBeforeTypedChar?: (data?: IBeforeTypedChar) => Promise<void>;
|
|
17
14
|
onTypedChar?: (data?: ITypedChar) => void;
|
|
18
15
|
processCharDisplay: (char: IChar) => void;
|
|
19
16
|
wholeContentRef: React.RefObject<IWholeContent>;
|
|
20
17
|
disableTyping: boolean;
|
|
21
18
|
triggerUpdate: () => void;
|
|
19
|
+
resetWholeContent: () => void;
|
|
22
20
|
}
|
|
23
21
|
export interface TypingTaskController {
|
|
24
22
|
start: () => void;
|
|
@@ -28,6 +26,7 @@ export interface TypingTaskController {
|
|
|
28
26
|
/** 是否主动调用 stop 方法 */
|
|
29
27
|
typedIsManualStopRef: React.RefObject<boolean>;
|
|
30
28
|
resume: () => void;
|
|
29
|
+
restart: () => void;
|
|
31
30
|
}
|
|
32
31
|
export declare const useTypingTask: (options: UseTypingTaskOptions) => TypingTaskController;
|
|
33
32
|
export {};
|
|
@@ -3,11 +3,11 @@ 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, disableTyping, triggerUpdate } = options;
|
|
6
|
+
const { timerType = 'setTimeout', interval, charsRef, onEnd, onStart, onBeforeTypedChar, onTypedChar, processCharDisplay, wholeContentRef, disableTyping, triggerUpdate, resetWholeContent, } = options;
|
|
7
7
|
/** 是否卸载 */
|
|
8
8
|
const isUnmountRef = (0, react_1.useRef)(false);
|
|
9
9
|
/** 是否正在打字 */
|
|
10
|
-
const
|
|
10
|
+
const isTypingRef = (0, react_1.useRef)(false);
|
|
11
11
|
/** 动画帧ID */
|
|
12
12
|
const animationFrameRef = (0, react_1.useRef)(null);
|
|
13
13
|
/** 传统定时器(兼容模式) */
|
|
@@ -27,30 +27,6 @@ const useTypingTask = (options) => {
|
|
|
27
27
|
isUnmountRef.current = true;
|
|
28
28
|
};
|
|
29
29
|
}, []);
|
|
30
|
-
/**
|
|
31
|
-
* 记录打过的字
|
|
32
|
-
* @param char 当前字符
|
|
33
|
-
* @returns
|
|
34
|
-
*/
|
|
35
|
-
const recordTypedChars = (char) => {
|
|
36
|
-
let prevStr = '';
|
|
37
|
-
if (!typedCharsRef.current || typedCharsRef.current.answerType !== char.answerType) {
|
|
38
|
-
typedCharsRef.current = {
|
|
39
|
-
typedContent: char.content,
|
|
40
|
-
answerType: char.answerType,
|
|
41
|
-
prevStr: '',
|
|
42
|
-
};
|
|
43
|
-
}
|
|
44
|
-
else {
|
|
45
|
-
prevStr = typedCharsRef.current.typedContent;
|
|
46
|
-
typedCharsRef.current.typedContent += char.content;
|
|
47
|
-
typedCharsRef.current.prevStr = prevStr;
|
|
48
|
-
}
|
|
49
|
-
return {
|
|
50
|
-
prevStr,
|
|
51
|
-
nextStr: typedCharsRef.current?.typedContent || '',
|
|
52
|
-
};
|
|
53
|
-
};
|
|
54
30
|
/**
|
|
55
31
|
* 触发打字开始回调
|
|
56
32
|
* @param char 当前字符
|
|
@@ -59,7 +35,7 @@ const useTypingTask = (options) => {
|
|
|
59
35
|
if (!onStart) {
|
|
60
36
|
return;
|
|
61
37
|
}
|
|
62
|
-
const
|
|
38
|
+
const prevStr = wholeContentRef.current[char.answerType].content;
|
|
63
39
|
onStart({
|
|
64
40
|
currentIndex: prevStr.length,
|
|
65
41
|
currentChar: char.content,
|
|
@@ -75,20 +51,34 @@ const useTypingTask = (options) => {
|
|
|
75
51
|
return;
|
|
76
52
|
}
|
|
77
53
|
onEnd({
|
|
78
|
-
str:
|
|
79
|
-
|
|
54
|
+
str: wholeContentRef.current.answer.content,
|
|
55
|
+
answerStr: wholeContentRef.current.answer.content,
|
|
56
|
+
thinkingStr: wholeContentRef.current.thinking.content,
|
|
80
57
|
manual: data?.manual ?? false,
|
|
81
58
|
});
|
|
82
59
|
};
|
|
83
60
|
/**
|
|
84
61
|
* 触发打字过程中回调
|
|
85
62
|
* @param char 当前字符
|
|
86
|
-
* @param isStartPoint 是否是开始打字(第一个字)
|
|
87
63
|
*/
|
|
88
|
-
const
|
|
89
|
-
if (!
|
|
90
|
-
|
|
64
|
+
const triggerOnBeforeTypedChar = async (char) => {
|
|
65
|
+
if (!onBeforeTypedChar) {
|
|
66
|
+
return;
|
|
91
67
|
}
|
|
68
|
+
const { answerType, content, index } = char;
|
|
69
|
+
const allLength = wholeContentRef.current.allLength;
|
|
70
|
+
// 计算之前字符的百分比
|
|
71
|
+
const percent = (char.index / allLength) * 100;
|
|
72
|
+
await onBeforeTypedChar({
|
|
73
|
+
currentIndex: index,
|
|
74
|
+
currentChar: content,
|
|
75
|
+
answerType: answerType,
|
|
76
|
+
prevStr: wholeContentRef.current[answerType].content,
|
|
77
|
+
percent,
|
|
78
|
+
});
|
|
79
|
+
};
|
|
80
|
+
/** 打字完成回调 */
|
|
81
|
+
const triggerOnTypedChar = async (char) => {
|
|
92
82
|
if (!onTypedChar) {
|
|
93
83
|
return;
|
|
94
84
|
}
|
|
@@ -99,7 +89,8 @@ const useTypingTask = (options) => {
|
|
|
99
89
|
currentIndex: index,
|
|
100
90
|
currentChar: content,
|
|
101
91
|
answerType: answerType,
|
|
102
|
-
prevStr:
|
|
92
|
+
prevStr: wholeContentRef.current[answerType].content.slice(0, index),
|
|
93
|
+
currentStr: wholeContentRef.current[answerType].content,
|
|
103
94
|
percent,
|
|
104
95
|
});
|
|
105
96
|
};
|
|
@@ -115,7 +106,7 @@ const useTypingTask = (options) => {
|
|
|
115
106
|
clearTimeout(timerRef.current);
|
|
116
107
|
timerRef.current = null;
|
|
117
108
|
}
|
|
118
|
-
|
|
109
|
+
isTypingRef.current = false;
|
|
119
110
|
typedCharsRef.current = undefined;
|
|
120
111
|
};
|
|
121
112
|
/** 开始打字任务 */
|
|
@@ -124,7 +115,7 @@ const useTypingTask = (options) => {
|
|
|
124
115
|
if (typedIsManualStopRef.current) {
|
|
125
116
|
return;
|
|
126
117
|
}
|
|
127
|
-
if (
|
|
118
|
+
if (isTypingRef.current) {
|
|
128
119
|
return;
|
|
129
120
|
}
|
|
130
121
|
if (timerType === 'requestAnimationFrame') {
|
|
@@ -135,7 +126,7 @@ const useTypingTask = (options) => {
|
|
|
135
126
|
}
|
|
136
127
|
};
|
|
137
128
|
/** 打字机打完所有字符 */
|
|
138
|
-
function typingRemainAll() {
|
|
129
|
+
async function typingRemainAll() {
|
|
139
130
|
const chars = getChars();
|
|
140
131
|
const thinkingCharsStr = chars
|
|
141
132
|
.filter((char) => char.answerType === 'thinking')
|
|
@@ -146,20 +137,20 @@ const useTypingTask = (options) => {
|
|
|
146
137
|
.map((char) => char.content)
|
|
147
138
|
.join('');
|
|
148
139
|
if (thinkingCharsStr) {
|
|
149
|
-
|
|
140
|
+
await onBeforeTypedChar?.({
|
|
150
141
|
currentIndex: wholeContentRef.current.thinking.length,
|
|
151
142
|
currentChar: thinkingCharsStr,
|
|
152
143
|
answerType: 'thinking',
|
|
153
|
-
prevStr:
|
|
144
|
+
prevStr: wholeContentRef.current.thinking.content,
|
|
154
145
|
percent: 100,
|
|
155
146
|
});
|
|
156
147
|
}
|
|
157
148
|
if (answerCharsStr) {
|
|
158
|
-
|
|
149
|
+
await onBeforeTypedChar?.({
|
|
159
150
|
currentIndex: wholeContentRef.current.answer.length,
|
|
160
151
|
currentChar: answerCharsStr,
|
|
161
152
|
answerType: 'answer',
|
|
162
|
-
prevStr:
|
|
153
|
+
prevStr: wholeContentRef.current.answer.content,
|
|
163
154
|
percent: 100,
|
|
164
155
|
});
|
|
165
156
|
}
|
|
@@ -169,17 +160,17 @@ const useTypingTask = (options) => {
|
|
|
169
160
|
wholeContentRef.current.answer.length += answerCharsStr.length;
|
|
170
161
|
wholeContentRef.current.allLength += thinkingCharsStr.length + answerCharsStr.length;
|
|
171
162
|
charsRef.current = [];
|
|
172
|
-
|
|
163
|
+
isTypingRef.current = false;
|
|
173
164
|
triggerOnEnd();
|
|
174
165
|
triggerUpdate();
|
|
175
166
|
}
|
|
176
167
|
/** requestAnimationFrame 模式 */
|
|
177
168
|
const startAnimationFrameMode = () => {
|
|
178
169
|
let lastFrameTime = 0;
|
|
179
|
-
const frameLoop = (currentTime) => {
|
|
170
|
+
const frameLoop = async (currentTime) => {
|
|
180
171
|
// 如果关闭打字机效果,则打完所有字符
|
|
181
172
|
if (disableTypingRef.current) {
|
|
182
|
-
typingRemainAll();
|
|
173
|
+
await typingRemainAll();
|
|
183
174
|
return;
|
|
184
175
|
}
|
|
185
176
|
const chars = getChars();
|
|
@@ -201,23 +192,23 @@ const useTypingTask = (options) => {
|
|
|
201
192
|
const char = chars.shift();
|
|
202
193
|
if (char === undefined)
|
|
203
194
|
break;
|
|
204
|
-
if (!
|
|
205
|
-
|
|
195
|
+
if (!isTypingRef.current) {
|
|
196
|
+
isTypingRef.current = true;
|
|
206
197
|
triggerOnStart(char);
|
|
207
|
-
triggerOnTypedChar(char, true);
|
|
208
|
-
}
|
|
209
|
-
else {
|
|
210
|
-
triggerOnTypedChar(char);
|
|
211
198
|
}
|
|
199
|
+
/** 打字前回调 */
|
|
200
|
+
await triggerOnBeforeTypedChar(char);
|
|
212
201
|
processCharDisplay(char);
|
|
202
|
+
/** 打字完成回调 */
|
|
203
|
+
triggerOnTypedChar(char);
|
|
213
204
|
}
|
|
214
|
-
lastFrameTime =
|
|
205
|
+
lastFrameTime = performance.now();
|
|
215
206
|
// 继续下一帧
|
|
216
207
|
if (chars.length > 0) {
|
|
217
208
|
animationFrameRef.current = requestAnimationFrame(frameLoop);
|
|
218
209
|
}
|
|
219
210
|
else {
|
|
220
|
-
|
|
211
|
+
isTypingRef.current = false;
|
|
221
212
|
triggerOnEnd();
|
|
222
213
|
}
|
|
223
214
|
};
|
|
@@ -225,7 +216,7 @@ const useTypingTask = (options) => {
|
|
|
225
216
|
};
|
|
226
217
|
/** 停止动画帧模式 */
|
|
227
218
|
const stopAnimationFrame = (manual = false) => {
|
|
228
|
-
|
|
219
|
+
isTypingRef.current = false;
|
|
229
220
|
if (animationFrameRef.current) {
|
|
230
221
|
cancelAnimationFrame(animationFrameRef.current);
|
|
231
222
|
animationFrameRef.current = null;
|
|
@@ -244,7 +235,7 @@ const useTypingTask = (options) => {
|
|
|
244
235
|
}
|
|
245
236
|
timerRef.current = setTimeout(startTyped, interval);
|
|
246
237
|
};
|
|
247
|
-
const startTyped = (isStartPoint = false) => {
|
|
238
|
+
const startTyped = async (isStartPoint = false) => {
|
|
248
239
|
// 如果关闭打字机效果,则打完所有字符
|
|
249
240
|
if (disableTypingRef.current) {
|
|
250
241
|
typingRemainAll();
|
|
@@ -253,7 +244,7 @@ const useTypingTask = (options) => {
|
|
|
253
244
|
const chars = getChars();
|
|
254
245
|
if (isUnmountRef.current)
|
|
255
246
|
return;
|
|
256
|
-
|
|
247
|
+
isTypingRef.current = true;
|
|
257
248
|
const char = chars.shift();
|
|
258
249
|
if (char === undefined) {
|
|
259
250
|
stopTimeout();
|
|
@@ -261,27 +252,26 @@ const useTypingTask = (options) => {
|
|
|
261
252
|
}
|
|
262
253
|
if (isStartPoint) {
|
|
263
254
|
triggerOnStart(char);
|
|
264
|
-
triggerOnTypedChar(char, isStartPoint);
|
|
265
|
-
}
|
|
266
|
-
else {
|
|
267
|
-
triggerOnTypedChar(char);
|
|
268
255
|
}
|
|
256
|
+
/** 打字前回调 */
|
|
257
|
+
await triggerOnBeforeTypedChar(char);
|
|
269
258
|
processCharDisplay(char);
|
|
259
|
+
/** 打字完成回调 */
|
|
260
|
+
triggerOnTypedChar(char);
|
|
270
261
|
nextTyped();
|
|
271
262
|
};
|
|
272
263
|
startTyped(true);
|
|
273
264
|
};
|
|
274
265
|
/** 停止超时模式 */
|
|
275
266
|
const stopTimeout = () => {
|
|
276
|
-
|
|
267
|
+
isTypingRef.current = false;
|
|
277
268
|
if (timerRef.current) {
|
|
278
269
|
clearTimeout(timerRef.current);
|
|
279
270
|
timerRef.current = null;
|
|
280
271
|
}
|
|
281
272
|
triggerOnEnd();
|
|
282
273
|
};
|
|
283
|
-
const
|
|
284
|
-
typedIsManualStopRef.current = true;
|
|
274
|
+
const cancelTask = () => {
|
|
285
275
|
if (timerType === 'requestAnimationFrame') {
|
|
286
276
|
stopAnimationFrame();
|
|
287
277
|
}
|
|
@@ -289,19 +279,54 @@ const useTypingTask = (options) => {
|
|
|
289
279
|
stopTimeout();
|
|
290
280
|
}
|
|
291
281
|
};
|
|
282
|
+
/** 暂时停止 */
|
|
283
|
+
const stopTask = () => {
|
|
284
|
+
typedIsManualStopRef.current = true;
|
|
285
|
+
cancelTask();
|
|
286
|
+
};
|
|
287
|
+
/** 停止打字任务 */
|
|
288
|
+
const endTask = () => {
|
|
289
|
+
cancelTask();
|
|
290
|
+
};
|
|
292
291
|
function restartTypedTask() {
|
|
292
|
+
endTask();
|
|
293
|
+
// 将wholeContentRef的内容放到charsRef中
|
|
294
|
+
charsRef.current.unshift(...wholeContentRef.current.thinking.content.split('').map((charUnit) => {
|
|
295
|
+
const char = {
|
|
296
|
+
content: charUnit,
|
|
297
|
+
answerType: 'thinking',
|
|
298
|
+
tokenId: 0,
|
|
299
|
+
index: 0,
|
|
300
|
+
};
|
|
301
|
+
return char;
|
|
302
|
+
}));
|
|
303
|
+
charsRef.current.unshift(...wholeContentRef.current.answer.content.split('').map((charUnit) => {
|
|
304
|
+
const char = {
|
|
305
|
+
content: charUnit,
|
|
306
|
+
answerType: 'answer',
|
|
307
|
+
tokenId: 0,
|
|
308
|
+
index: 0,
|
|
309
|
+
};
|
|
310
|
+
return char;
|
|
311
|
+
}));
|
|
312
|
+
resetWholeContent();
|
|
313
|
+
triggerUpdate();
|
|
314
|
+
startTypedTask();
|
|
315
|
+
}
|
|
316
|
+
function clear() {
|
|
317
|
+
clearTimer();
|
|
318
|
+
}
|
|
319
|
+
function resume() {
|
|
293
320
|
typedIsManualStopRef.current = false;
|
|
294
321
|
startTypedTask();
|
|
295
322
|
}
|
|
296
323
|
return {
|
|
297
324
|
start: startTypedTask,
|
|
325
|
+
restart: restartTypedTask,
|
|
298
326
|
stop: stopTask,
|
|
299
|
-
resume:
|
|
300
|
-
clear:
|
|
301
|
-
|
|
302
|
-
typedCharsRef.current = undefined;
|
|
303
|
-
},
|
|
304
|
-
isTyping: () => isTypedRef.current,
|
|
327
|
+
resume: resume,
|
|
328
|
+
clear: clear,
|
|
329
|
+
isTyping: () => isTypingRef.current,
|
|
305
330
|
typedIsManualStopRef,
|
|
306
331
|
};
|
|
307
332
|
};
|
|
@@ -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":"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"}
|
|
@@ -40,6 +40,12 @@ const MarkdownInner = ({ children: _children = '', answerType, markdownRef, ...r
|
|
|
40
40
|
resume: () => {
|
|
41
41
|
cmdRef.current.resume();
|
|
42
42
|
},
|
|
43
|
+
start: () => {
|
|
44
|
+
cmdRef.current.start();
|
|
45
|
+
},
|
|
46
|
+
restart: () => {
|
|
47
|
+
cmdRef.current.restart();
|
|
48
|
+
},
|
|
43
49
|
}));
|
|
44
50
|
return _jsx(MarkdownCMD, { ref: cmdRef, ...rest });
|
|
45
51
|
};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/Markdown/index.tsx"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/Markdown/index.tsx"],"names":[],"mappings":"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"}
|
|
@@ -4,7 +4,11 @@ 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, disableTyping = false }, ref) => {
|
|
7
|
+
const MarkdownCMD = forwardRef(({ interval = 30, onEnd, onStart, onTypedChar, onBeforeTypedChar, timerType = 'setTimeout', theme = 'light', math, plugins, disableTyping = false, autoStartTyping = true }, ref) => {
|
|
8
|
+
/** 是否自动开启打字动画, 后面发生变化将不会生效 */
|
|
9
|
+
const autoStartTypingRef = useRef(autoStartTyping);
|
|
10
|
+
/** 是否打过字 */
|
|
11
|
+
const isStartedTypingRef = useRef(false);
|
|
8
12
|
/** 当前需要打字的内容 */
|
|
9
13
|
const charsRef = useRef([]);
|
|
10
14
|
/**
|
|
@@ -18,10 +22,12 @@ const MarkdownCMD = forwardRef(({ interval = 30, onEnd, onStart, onTypedChar, ti
|
|
|
18
22
|
thinking: {
|
|
19
23
|
content: '',
|
|
20
24
|
length: 0,
|
|
25
|
+
prevLength: 0,
|
|
21
26
|
},
|
|
22
27
|
answer: {
|
|
23
28
|
content: '',
|
|
24
29
|
length: 0,
|
|
30
|
+
prevLength: 0,
|
|
25
31
|
},
|
|
26
32
|
allLength: 0,
|
|
27
33
|
});
|
|
@@ -33,6 +39,9 @@ const MarkdownCMD = forwardRef(({ interval = 30, onEnd, onStart, onTypedChar, ti
|
|
|
33
39
|
* 处理字符显示逻辑
|
|
34
40
|
*/
|
|
35
41
|
const processCharDisplay = (char) => {
|
|
42
|
+
if (!isStartedTypingRef.current) {
|
|
43
|
+
isStartedTypingRef.current = true;
|
|
44
|
+
}
|
|
36
45
|
if (char.answerType === 'thinking') {
|
|
37
46
|
wholeContentRef.current.thinking.content += char.content;
|
|
38
47
|
wholeContentRef.current.thinking.length += 1;
|
|
@@ -43,6 +52,15 @@ const MarkdownCMD = forwardRef(({ interval = 30, onEnd, onStart, onTypedChar, ti
|
|
|
43
52
|
}
|
|
44
53
|
triggerUpdate();
|
|
45
54
|
};
|
|
55
|
+
const resetWholeContent = () => {
|
|
56
|
+
wholeContentRef.current.thinking.content = '';
|
|
57
|
+
wholeContentRef.current.thinking.length = 0;
|
|
58
|
+
wholeContentRef.current.thinking.prevLength = 0;
|
|
59
|
+
wholeContentRef.current.answer.content = '';
|
|
60
|
+
wholeContentRef.current.answer.length = 0;
|
|
61
|
+
wholeContentRef.current.answer.prevLength = 0;
|
|
62
|
+
wholeContentRef.current.allLength = 0;
|
|
63
|
+
};
|
|
46
64
|
// 使用新的打字任务 hook
|
|
47
65
|
const typingTask = useTypingTask({
|
|
48
66
|
timerType,
|
|
@@ -51,10 +69,12 @@ const MarkdownCMD = forwardRef(({ interval = 30, onEnd, onStart, onTypedChar, ti
|
|
|
51
69
|
onEnd,
|
|
52
70
|
onStart,
|
|
53
71
|
onTypedChar,
|
|
72
|
+
onBeforeTypedChar,
|
|
54
73
|
processCharDisplay,
|
|
55
74
|
wholeContentRef,
|
|
56
75
|
disableTyping,
|
|
57
76
|
triggerUpdate,
|
|
77
|
+
resetWholeContent,
|
|
58
78
|
});
|
|
59
79
|
/**
|
|
60
80
|
* 内部推送处理逻辑
|
|
@@ -68,21 +88,32 @@ const MarkdownCMD = forwardRef(({ interval = 30, onEnd, onStart, onTypedChar, ti
|
|
|
68
88
|
const charObj = {
|
|
69
89
|
content: chatStr,
|
|
70
90
|
answerType,
|
|
71
|
-
contentType: 'segment',
|
|
72
91
|
tokenId: 0,
|
|
73
92
|
index,
|
|
74
93
|
};
|
|
75
94
|
return charObj;
|
|
76
95
|
}));
|
|
77
96
|
wholeContentRef.current.allLength += content.length;
|
|
97
|
+
// 如果关闭了自动打字, 并且没有打过字, 则不开启打字动画
|
|
98
|
+
if (!autoStartTypingRef.current && !isStartedTypingRef.current) {
|
|
99
|
+
return;
|
|
100
|
+
}
|
|
78
101
|
if (!typingTask.isTyping()) {
|
|
79
102
|
typingTask.start();
|
|
80
103
|
}
|
|
81
104
|
};
|
|
82
105
|
const processNoTypingPush = (content, answerType) => {
|
|
83
106
|
wholeContentRef.current[answerType].content += content;
|
|
107
|
+
// 记录打字前的长度
|
|
108
|
+
wholeContentRef.current[answerType].prevLength = wholeContentRef.current[answerType].length;
|
|
84
109
|
wholeContentRef.current[answerType].length += content.length;
|
|
85
110
|
triggerUpdate();
|
|
111
|
+
onEnd?.({
|
|
112
|
+
str: content,
|
|
113
|
+
answerStr: wholeContentRef.current.answer.content,
|
|
114
|
+
thinkingStr: wholeContentRef.current.thinking.content,
|
|
115
|
+
manual: false,
|
|
116
|
+
});
|
|
86
117
|
};
|
|
87
118
|
useImperativeHandle(ref, () => ({
|
|
88
119
|
/**
|
|
@@ -104,15 +135,18 @@ const MarkdownCMD = forwardRef(({ interval = 30, onEnd, onStart, onTypedChar, ti
|
|
|
104
135
|
typingTask.stop();
|
|
105
136
|
typingTask.typedIsManualStopRef.current = false;
|
|
106
137
|
charsRef.current = [];
|
|
107
|
-
|
|
108
|
-
wholeContentRef.current.thinking.length = 0;
|
|
109
|
-
wholeContentRef.current.answer.content = '';
|
|
110
|
-
wholeContentRef.current.answer.length = 0;
|
|
111
|
-
wholeContentRef.current.allLength = 0;
|
|
138
|
+
resetWholeContent();
|
|
112
139
|
isWholeTypedEndRef.current = false;
|
|
113
140
|
charIndexRef.current = 0;
|
|
141
|
+
isStartedTypingRef.current = false;
|
|
114
142
|
triggerUpdate();
|
|
115
143
|
},
|
|
144
|
+
/** 开启打字,只有在关闭了自动打字才生效 */
|
|
145
|
+
start: () => {
|
|
146
|
+
if (!autoStartTypingRef.current) {
|
|
147
|
+
typingTask.start();
|
|
148
|
+
}
|
|
149
|
+
},
|
|
116
150
|
/** 停止打字任务 */
|
|
117
151
|
stop: () => {
|
|
118
152
|
typingTask.stop();
|
|
@@ -129,14 +163,17 @@ const MarkdownCMD = forwardRef(({ interval = 30, onEnd, onStart, onTypedChar, ti
|
|
|
129
163
|
if (!typingTask.isTyping()) {
|
|
130
164
|
// 这里需要手动触发结束回调,因为 hook 中的 triggerOnEnd 不能直接调用
|
|
131
165
|
onEnd?.({
|
|
132
|
-
str:
|
|
133
|
-
|
|
166
|
+
str: wholeContentRef.current.answer.content,
|
|
167
|
+
answerStr: wholeContentRef.current.answer.content,
|
|
168
|
+
thinkingStr: wholeContentRef.current.thinking.content,
|
|
169
|
+
manual: true,
|
|
134
170
|
});
|
|
135
171
|
}
|
|
136
172
|
},
|
|
137
|
-
/**
|
|
138
|
-
|
|
139
|
-
|
|
173
|
+
/** 重新开始打字任务 */
|
|
174
|
+
restart: () => {
|
|
175
|
+
typingTask.restart();
|
|
176
|
+
},
|
|
140
177
|
}));
|
|
141
178
|
const getParagraphs = (answerType) => {
|
|
142
179
|
const content = wholeContentRef.current[answerType].content || '';
|