ds-markdown 0.0.10-beta.1 → 0.0.10-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.md +234 -67
- package/dist/cjs/MarkdownCMD/index.js +183 -225
- package/dist/cjs/MarkdownCMD/index.js.map +1 -1
- package/dist/cjs/defined.d.ts +20 -0
- package/dist/cjs/hooks/useTypingTask.d.ts +31 -0
- package/dist/cjs/hooks/useTypingTask.js +226 -0
- package/dist/cjs/hooks/useTypingTask.js.map +1 -0
- package/dist/cjs/utils/Tokenizer.d.ts +11 -0
- package/dist/cjs/utils/Tokenizer.js +26 -4
- package/dist/cjs/utils/Tokenizer.js.map +1 -1
- package/dist/cjs/utils/compiler.js +5 -1
- package/dist/cjs/utils/compiler.js.map +1 -1
- package/dist/cjs/utils/methods/deepClone.d.ts +1 -0
- package/dist/cjs/utils/methods/deepClone.js +7 -0
- package/dist/cjs/utils/methods/deepClone.js.map +1 -0
- package/dist/cjs/utils/rule.js +2 -1
- package/dist/cjs/utils/rule.js.map +1 -1
- package/dist/esm/MarkdownCMD/index.js +184 -226
- package/dist/esm/MarkdownCMD/index.js.map +1 -1
- package/dist/esm/defined.d.ts +20 -0
- package/dist/esm/hooks/useTypingTask.d.ts +31 -0
- package/dist/esm/hooks/useTypingTask.js +222 -0
- package/dist/esm/hooks/useTypingTask.js.map +1 -0
- package/dist/esm/utils/Tokenizer.d.ts +11 -0
- package/dist/esm/utils/Tokenizer.js +24 -3
- package/dist/esm/utils/Tokenizer.js.map +1 -1
- package/dist/esm/utils/compiler.js +6 -2
- package/dist/esm/utils/compiler.js.map +1 -1
- package/dist/esm/utils/methods/deepClone.d.ts +1 -0
- package/dist/esm/utils/methods/deepClone.js +4 -0
- package/dist/esm/utils/methods/deepClone.js.map +1 -0
- package/dist/esm/utils/rule.js +2 -1
- package/dist/esm/utils/rule.js.map +1 -1
- package/package.json +1 -1
|
@@ -9,7 +9,9 @@ const index_js_1 = __importDefault(require("../components/HighReactMarkdown/inde
|
|
|
9
9
|
const classnames_1 = __importDefault(require("classnames"));
|
|
10
10
|
const compiler_js_1 = require("../utils/compiler.js");
|
|
11
11
|
const constant_js_1 = require("../constant.js");
|
|
12
|
-
const
|
|
12
|
+
const deepClone_js_1 = __importDefault(require("../utils/methods/deepClone.js"));
|
|
13
|
+
const useTypingTask_js_1 = require("../hooks/useTypingTask.js");
|
|
14
|
+
const MarkdownCMD = (0, react_1.forwardRef)(({ interval = 30, onEnd, onStart, onTypedChar, timerType = 'requestAnimationFrame' }, ref) => {
|
|
13
15
|
/** 当前需要打字的内容 */
|
|
14
16
|
const charsRef = (0, react_1.useRef)([]);
|
|
15
17
|
/**
|
|
@@ -17,23 +19,6 @@ const MarkdownCMD = (0, react_1.forwardRef)(({ interval = 30, isClosePrettyTyped
|
|
|
17
19
|
* 如果打字已经完全结束,则不会再触发打字效果
|
|
18
20
|
*/
|
|
19
21
|
const isWholeTypedEndRef = (0, react_1.useRef)(false);
|
|
20
|
-
/** 已经打过的字 */
|
|
21
|
-
const typedCharsRef = (0, react_1.useRef)(undefined);
|
|
22
|
-
/** 是否卸载 */
|
|
23
|
-
const isUnmountRef = (0, react_1.useRef)(false);
|
|
24
|
-
/** 是否正在打字 */
|
|
25
|
-
const isTypedRef = (0, react_1.useRef)(false);
|
|
26
|
-
/** 打字结束回调, */
|
|
27
|
-
const onEndRef = (0, react_1.useRef)(onEnd);
|
|
28
|
-
onEndRef.current = onEnd;
|
|
29
|
-
/** 打字开始回调 */
|
|
30
|
-
const onStartRef = (0, react_1.useRef)(onStart);
|
|
31
|
-
onStartRef.current = onStart;
|
|
32
|
-
/** 打字过程中回调 */
|
|
33
|
-
const onTypedCharRef = (0, react_1.useRef)(onTypedChar);
|
|
34
|
-
onTypedCharRef.current = onTypedChar;
|
|
35
|
-
/** 打字定时器 */
|
|
36
|
-
const timerRef = (0, react_1.useRef)(null);
|
|
37
22
|
/**
|
|
38
23
|
* 稳定段落
|
|
39
24
|
* 稳定段落是已经打过字,并且不会再变化的段落
|
|
@@ -43,211 +28,122 @@ const MarkdownCMD = (0, react_1.forwardRef)(({ interval = 30, isClosePrettyTyped
|
|
|
43
28
|
const [currentSegment, setCurrentSegment] = (0, react_1.useState)(undefined);
|
|
44
29
|
/** 当前段落引用 */
|
|
45
30
|
const currentParagraphRef = (0, react_1.useRef)(undefined);
|
|
46
|
-
currentParagraphRef.current = currentSegment;
|
|
47
|
-
/** 清除打字定时器 */
|
|
48
|
-
const clearTimer = () => {
|
|
49
|
-
if (timerRef.current) {
|
|
50
|
-
clearTimeout(timerRef.current);
|
|
51
|
-
timerRef.current = null;
|
|
52
|
-
}
|
|
53
|
-
isTypedRef.current = false;
|
|
54
|
-
};
|
|
55
|
-
(0, react_1.useEffect)(() => {
|
|
56
|
-
isUnmountRef.current = false;
|
|
57
|
-
return () => {
|
|
58
|
-
isUnmountRef.current = true;
|
|
59
|
-
};
|
|
60
|
-
}, []);
|
|
61
|
-
/** 思考段落 */
|
|
62
|
-
const thinkingParagraphs = (0, react_1.useMemo)(() => stableSegments.filter((paragraph) => paragraph.answerType === 'thinking'), [stableSegments]);
|
|
63
|
-
/** 回答段落 */
|
|
64
|
-
const answerParagraphs = (0, react_1.useMemo)(() => stableSegments.filter((paragraph) => paragraph.answerType === 'answer'), [stableSegments]);
|
|
65
|
-
/**
|
|
66
|
-
* 记录打过的字
|
|
67
|
-
* @param char 当前字符
|
|
68
|
-
* @returns
|
|
69
|
-
*/
|
|
70
|
-
const recordTypedChars = (char) => {
|
|
71
|
-
let prevStr = '';
|
|
72
|
-
if (!typedCharsRef.current || typedCharsRef.current.answerType !== char.answerType) {
|
|
73
|
-
typedCharsRef.current = {
|
|
74
|
-
typedContent: char.content,
|
|
75
|
-
answerType: char.answerType,
|
|
76
|
-
prevStr: '',
|
|
77
|
-
};
|
|
78
|
-
}
|
|
79
|
-
else {
|
|
80
|
-
prevStr = typedCharsRef.current.typedContent;
|
|
81
|
-
typedCharsRef.current.typedContent += char.content;
|
|
82
|
-
typedCharsRef.current.prevStr = prevStr;
|
|
83
|
-
}
|
|
84
|
-
return {
|
|
85
|
-
prevStr,
|
|
86
|
-
nextStr: typedCharsRef.current?.typedContent || '',
|
|
87
|
-
};
|
|
88
|
-
};
|
|
89
|
-
/**
|
|
90
|
-
* 触发打字开始回调
|
|
91
|
-
* @param char 当前字符
|
|
92
|
-
*/
|
|
93
|
-
const triggerOnStart = (char) => {
|
|
94
|
-
const onStartFn = onStartRef.current;
|
|
95
|
-
if (!onStartFn) {
|
|
96
|
-
return;
|
|
97
|
-
}
|
|
98
|
-
const { prevStr } = recordTypedChars(char);
|
|
99
|
-
onStartRef.current?.({
|
|
100
|
-
currentIndex: prevStr.length,
|
|
101
|
-
currentChar: char.content,
|
|
102
|
-
answerType: char.answerType,
|
|
103
|
-
prevStr,
|
|
104
|
-
});
|
|
105
|
-
};
|
|
106
|
-
/**
|
|
107
|
-
* 触发打字结束回调
|
|
108
|
-
*/
|
|
109
|
-
const triggerOnEnd = () => {
|
|
110
|
-
const onEndFn = onEndRef.current;
|
|
111
|
-
if (!onEndFn) {
|
|
112
|
-
return;
|
|
113
|
-
}
|
|
114
|
-
onEndFn({
|
|
115
|
-
str: typedCharsRef.current?.typedContent,
|
|
116
|
-
answerType: typedCharsRef.current?.answerType,
|
|
117
|
-
});
|
|
118
|
-
};
|
|
31
|
+
// currentParagraphRef.current = currentSegment;
|
|
119
32
|
/**
|
|
120
|
-
*
|
|
121
|
-
* @param char 当前字符
|
|
122
|
-
* @param isStartPoint 是否是开始打字(第一个字)
|
|
33
|
+
* 处理字符显示逻辑
|
|
123
34
|
*/
|
|
124
|
-
const
|
|
125
|
-
const
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
prevStr: typedCharsRef.current?.prevStr || '',
|
|
137
|
-
});
|
|
138
|
-
};
|
|
139
|
-
/** 开始打字任务 */
|
|
140
|
-
const startTypedTask = () => {
|
|
141
|
-
if (isTypedRef.current) {
|
|
142
|
-
return;
|
|
143
|
-
}
|
|
144
|
-
const chars = charsRef.current;
|
|
145
|
-
/** 停止打字 */
|
|
146
|
-
const stopTyped = () => {
|
|
147
|
-
isTypedRef.current = false;
|
|
148
|
-
if (timerRef.current) {
|
|
149
|
-
clearTimeout(timerRef.current);
|
|
150
|
-
timerRef.current = null;
|
|
151
|
-
}
|
|
152
|
-
triggerOnEnd();
|
|
153
|
-
};
|
|
154
|
-
/** 打下一个字 */
|
|
155
|
-
const nextTyped = () => {
|
|
156
|
-
if (chars.length === 0) {
|
|
157
|
-
stopTyped();
|
|
158
|
-
return;
|
|
159
|
-
}
|
|
160
|
-
timerRef.current = setTimeout(startTyped, interval);
|
|
161
|
-
};
|
|
162
|
-
/**
|
|
163
|
-
* 开始打字
|
|
164
|
-
* @param isStartPoint 是否是开始打字
|
|
165
|
-
*/
|
|
166
|
-
function startTyped(isStartPoint = false) {
|
|
167
|
-
if (isUnmountRef.current) {
|
|
168
|
-
return;
|
|
169
|
-
}
|
|
170
|
-
isTypedRef.current = true;
|
|
171
|
-
const char = chars.shift();
|
|
172
|
-
if (char === undefined) {
|
|
173
|
-
stopTyped();
|
|
174
|
-
return;
|
|
175
|
-
}
|
|
176
|
-
if (isStartPoint) {
|
|
177
|
-
triggerOnStart(char);
|
|
178
|
-
triggerOnTypedChar(char, isStartPoint);
|
|
179
|
-
}
|
|
180
|
-
else {
|
|
181
|
-
triggerOnTypedChar(char);
|
|
182
|
-
}
|
|
183
|
-
const currentSegment = currentParagraphRef.current;
|
|
184
|
-
/** 如果碰到 space 则需要处理成两个段落 */
|
|
185
|
-
if (char.contentType === 'space') {
|
|
186
|
-
if (currentSegment) {
|
|
187
|
-
setStableSegments((prev) => {
|
|
188
|
-
const newParagraphs = [...prev];
|
|
189
|
-
if (currentSegment) {
|
|
190
|
-
newParagraphs.push({ ...currentSegment, isTyped: false });
|
|
191
|
-
}
|
|
192
|
-
newParagraphs.push({
|
|
193
|
-
content: '',
|
|
194
|
-
isTyped: false,
|
|
195
|
-
type: 'br',
|
|
196
|
-
answerType: char.answerType,
|
|
197
|
-
});
|
|
198
|
-
return newParagraphs;
|
|
199
|
-
});
|
|
200
|
-
setCurrentSegment(undefined);
|
|
201
|
-
}
|
|
202
|
-
else {
|
|
203
|
-
setStableSegments((prev) => {
|
|
204
|
-
const newParagraphs = [...prev];
|
|
35
|
+
const processCharDisplay = (char) => {
|
|
36
|
+
const currentSegment = currentParagraphRef.current;
|
|
37
|
+
/** 如果碰到 space,和split_segment 则需要处理成两个段落 */
|
|
38
|
+
if (char.contentType === 'space' || char.contentType === 'split_segment') {
|
|
39
|
+
if (currentSegment) {
|
|
40
|
+
setStableSegments((prev) => {
|
|
41
|
+
const newParagraphs = [...prev];
|
|
42
|
+
// 放入到稳定队列
|
|
43
|
+
if (currentSegment) {
|
|
44
|
+
newParagraphs.push({ ...currentSegment, isTyped: false });
|
|
45
|
+
}
|
|
46
|
+
if (char.contentType === 'space') {
|
|
205
47
|
newParagraphs.push({
|
|
206
48
|
content: '',
|
|
207
49
|
isTyped: false,
|
|
208
50
|
type: 'br',
|
|
209
51
|
answerType: char.answerType,
|
|
52
|
+
tokensReference: {
|
|
53
|
+
[char.tokenId]: {
|
|
54
|
+
startIndex: 0,
|
|
55
|
+
raw: char.content,
|
|
56
|
+
},
|
|
57
|
+
},
|
|
210
58
|
});
|
|
211
|
-
|
|
212
|
-
|
|
213
|
-
}
|
|
214
|
-
|
|
215
|
-
|
|
216
|
-
}
|
|
217
|
-
// 处理当前段落
|
|
218
|
-
let _currentParagraph = currentSegment;
|
|
219
|
-
const newCurrentParagraph = {
|
|
220
|
-
content: '',
|
|
221
|
-
isTyped: false,
|
|
222
|
-
type: 'text',
|
|
223
|
-
answerType: char.answerType,
|
|
224
|
-
};
|
|
225
|
-
if (!_currentParagraph) {
|
|
226
|
-
// 如果当前没有段落,则直接设置为当前段落
|
|
227
|
-
_currentParagraph = newCurrentParagraph;
|
|
59
|
+
}
|
|
60
|
+
return newParagraphs;
|
|
61
|
+
});
|
|
62
|
+
setCurrentSegment(() => undefined);
|
|
63
|
+
currentParagraphRef.current = undefined;
|
|
228
64
|
}
|
|
229
|
-
else
|
|
230
|
-
// 如果当前段落和当前字符的回答类型不一致,则需要处理成两个段落
|
|
65
|
+
else {
|
|
231
66
|
setStableSegments((prev) => {
|
|
232
67
|
const newParagraphs = [...prev];
|
|
233
|
-
newParagraphs.push({
|
|
68
|
+
newParagraphs.push({
|
|
69
|
+
content: '',
|
|
70
|
+
isTyped: false,
|
|
71
|
+
type: 'br',
|
|
72
|
+
answerType: char.answerType,
|
|
73
|
+
tokensReference: {
|
|
74
|
+
[char.tokenId]: {
|
|
75
|
+
startIndex: 0,
|
|
76
|
+
raw: char.content,
|
|
77
|
+
},
|
|
78
|
+
},
|
|
79
|
+
});
|
|
234
80
|
return newParagraphs;
|
|
235
81
|
});
|
|
236
|
-
_currentParagraph = newCurrentParagraph;
|
|
237
|
-
setCurrentSegment(_currentParagraph);
|
|
238
82
|
}
|
|
239
|
-
|
|
240
|
-
|
|
241
|
-
|
|
242
|
-
|
|
243
|
-
|
|
244
|
-
|
|
83
|
+
return;
|
|
84
|
+
}
|
|
85
|
+
// 处理当前段落
|
|
86
|
+
const newCurrentParagraph = {
|
|
87
|
+
content: '',
|
|
88
|
+
isTyped: false,
|
|
89
|
+
type: 'text',
|
|
90
|
+
answerType: char.answerType,
|
|
91
|
+
tokensReference: {},
|
|
92
|
+
};
|
|
93
|
+
let _currentParagraph = currentSegment;
|
|
94
|
+
if (!_currentParagraph) {
|
|
95
|
+
// 如果当前没有段落,则直接设置为新当前段落
|
|
96
|
+
_currentParagraph = newCurrentParagraph;
|
|
97
|
+
}
|
|
98
|
+
else if (currentSegment && currentSegment?.answerType !== char.answerType) {
|
|
99
|
+
// 如果当前段落和当前字符的回答类型不一致,则需要处理成两个段落
|
|
100
|
+
setStableSegments((prev) => {
|
|
101
|
+
const newParagraphs = [...prev];
|
|
102
|
+
newParagraphs.push({ ...currentSegment, isTyped: false });
|
|
103
|
+
return newParagraphs;
|
|
245
104
|
});
|
|
246
|
-
|
|
105
|
+
_currentParagraph = newCurrentParagraph;
|
|
247
106
|
}
|
|
248
|
-
|
|
107
|
+
const tokensReference = (0, deepClone_js_1.default)(_currentParagraph.tokensReference);
|
|
108
|
+
if (tokensReference[char.tokenId]) {
|
|
109
|
+
tokensReference[char.tokenId].raw += char.content;
|
|
110
|
+
tokensReference[char.tokenId].startIndex = currentSegment?.content?.length || 0;
|
|
111
|
+
}
|
|
112
|
+
else {
|
|
113
|
+
tokensReference[char.tokenId] = {
|
|
114
|
+
startIndex: currentSegment?.content?.length || 0,
|
|
115
|
+
raw: char.content,
|
|
116
|
+
};
|
|
117
|
+
}
|
|
118
|
+
const newCurrentSegment = {
|
|
119
|
+
..._currentParagraph,
|
|
120
|
+
tokensReference,
|
|
121
|
+
content: (currentSegment?.content || '') + char.content,
|
|
122
|
+
isTyped: true,
|
|
123
|
+
};
|
|
124
|
+
currentParagraphRef.current = newCurrentSegment;
|
|
125
|
+
setCurrentSegment(() => newCurrentSegment);
|
|
249
126
|
};
|
|
250
|
-
|
|
127
|
+
/** 思考段落 */
|
|
128
|
+
const thinkingParagraphs = (0, react_1.useMemo)(() => stableSegments.filter((paragraph) => paragraph.answerType === 'thinking'), [stableSegments]);
|
|
129
|
+
/** 回答段落 */
|
|
130
|
+
const answerParagraphs = (0, react_1.useMemo)(() => stableSegments.filter((paragraph) => paragraph.answerType === 'answer'), [stableSegments]);
|
|
131
|
+
// 使用新的打字任务 hook
|
|
132
|
+
const typingTask = (0, useTypingTask_js_1.useTypingTask)({
|
|
133
|
+
timerType,
|
|
134
|
+
interval,
|
|
135
|
+
charsRef,
|
|
136
|
+
onEnd,
|
|
137
|
+
onStart,
|
|
138
|
+
onTypedChar,
|
|
139
|
+
processCharDisplay,
|
|
140
|
+
});
|
|
141
|
+
const lastSegmentRawRef = (0, react_1.useRef)({
|
|
142
|
+
thinking: '',
|
|
143
|
+
answer: '',
|
|
144
|
+
thinkingReference: null,
|
|
145
|
+
answerReference: null,
|
|
146
|
+
});
|
|
251
147
|
(0, react_1.useImperativeHandle)(ref, () => ({
|
|
252
148
|
/**
|
|
253
149
|
* 添加内容
|
|
@@ -255,55 +151,117 @@ const MarkdownCMD = (0, react_1.forwardRef)(({ interval = 30, isClosePrettyTyped
|
|
|
255
151
|
* @param answerType 回答类型 {AnswerType}
|
|
256
152
|
*/
|
|
257
153
|
push: (content, answerType) => {
|
|
154
|
+
if (content.length === 0) {
|
|
155
|
+
return;
|
|
156
|
+
}
|
|
157
|
+
const lastSegmentReference = lastSegmentRawRef.current[`${answerType}Reference`];
|
|
258
158
|
if (isWholeTypedEndRef.current) {
|
|
259
159
|
if (constant_js_1.__DEV__) {
|
|
260
160
|
console.warn('打字已经完全结束,不能再添加新的内容');
|
|
261
161
|
}
|
|
262
162
|
return;
|
|
263
163
|
}
|
|
264
|
-
|
|
265
|
-
|
|
164
|
+
let currentLastSegmentReference = null;
|
|
165
|
+
let currentLastSegmentRaw = '';
|
|
166
|
+
let lastSegmentRaw = '';
|
|
167
|
+
if (lastSegmentReference) {
|
|
168
|
+
lastSegmentRaw = lastSegmentReference.noTrimEndRaw || lastSegmentReference.raw;
|
|
169
|
+
currentLastSegmentRaw = lastSegmentRaw + content;
|
|
266
170
|
}
|
|
267
171
|
else {
|
|
268
|
-
|
|
172
|
+
currentLastSegmentRaw = content;
|
|
269
173
|
}
|
|
270
|
-
const tokens = (0, compiler_js_1.compiler)(
|
|
271
|
-
// 如果最后一个token是
|
|
272
|
-
if (tokens[tokens.length - 1].type === '
|
|
273
|
-
|
|
174
|
+
const tokens = (0, compiler_js_1.compiler)(currentLastSegmentRaw);
|
|
175
|
+
// 如果最后一个token是space,则把lastSegmentRaw设置为空
|
|
176
|
+
if (tokens[tokens.length - 1].type === 'space') {
|
|
177
|
+
currentLastSegmentReference = null;
|
|
274
178
|
}
|
|
275
179
|
else {
|
|
276
|
-
|
|
180
|
+
currentLastSegmentReference = tokens[tokens.length - 1];
|
|
277
181
|
}
|
|
278
|
-
|
|
279
|
-
|
|
280
|
-
|
|
182
|
+
const pushAndSplitSegment = (raw, currenIndex) => {
|
|
183
|
+
const currentToken = tokens[currenIndex];
|
|
184
|
+
if (currenIndex > 0) {
|
|
185
|
+
const prevToken = tokens[currenIndex - 1];
|
|
186
|
+
if (prevToken.type !== 'space' && currentToken.type !== 'space') {
|
|
187
|
+
charsRef.current.push({ content: '', answerType, contentType: 'split_segment', tokenId: currentToken.id });
|
|
188
|
+
}
|
|
281
189
|
}
|
|
282
|
-
|
|
283
|
-
|
|
190
|
+
charsRef.current.push(...raw.split('').map((char) => ({ content: char, answerType, contentType: 'segment', tokenId: currentToken.id })));
|
|
191
|
+
};
|
|
192
|
+
if (!lastSegmentReference) {
|
|
193
|
+
tokens.forEach((token, i) => {
|
|
194
|
+
if (token.type === 'space') {
|
|
195
|
+
charsRef.current.push({ content: token.raw, answerType, contentType: 'space', tokenId: token.id });
|
|
196
|
+
}
|
|
197
|
+
else {
|
|
198
|
+
pushAndSplitSegment(token.raw, i);
|
|
199
|
+
}
|
|
200
|
+
});
|
|
201
|
+
}
|
|
202
|
+
else {
|
|
203
|
+
let str = '';
|
|
204
|
+
let firstSpaceIndex = -1;
|
|
205
|
+
let nextTokenIndex = lastSegmentRaw.length;
|
|
206
|
+
for (let i = 0; i < tokens.length; i++) {
|
|
207
|
+
const token = tokens[i];
|
|
208
|
+
if (token.type === 'space') {
|
|
209
|
+
if (firstSpaceIndex === -1) {
|
|
210
|
+
firstSpaceIndex = str.length;
|
|
211
|
+
}
|
|
212
|
+
str += token.raw;
|
|
213
|
+
if (lastSegmentRaw.length > firstSpaceIndex) {
|
|
214
|
+
// 如果lastSegmentRaw的长度大于firstSpaceIndex,则需要将当前设置为 segment
|
|
215
|
+
charsRef.current.push(...token.raw.split('').map((char) => ({ content: char, answerType, contentType: 'segment', tokenId: token.id })));
|
|
216
|
+
}
|
|
217
|
+
else {
|
|
218
|
+
charsRef.current.push({ content: token.raw, answerType, contentType: 'space', tokenId: token.id });
|
|
219
|
+
}
|
|
220
|
+
}
|
|
221
|
+
else {
|
|
222
|
+
str += token.noTrimEndRaw || token.raw;
|
|
223
|
+
const realRaw = str.slice(nextTokenIndex);
|
|
224
|
+
if (realRaw.length > 0) {
|
|
225
|
+
pushAndSplitSegment(realRaw, i);
|
|
226
|
+
}
|
|
227
|
+
}
|
|
228
|
+
nextTokenIndex = str.length;
|
|
284
229
|
}
|
|
285
|
-
}
|
|
286
|
-
|
|
287
|
-
|
|
230
|
+
}
|
|
231
|
+
lastSegmentRawRef.current[`${answerType}Reference`] = currentLastSegmentReference;
|
|
232
|
+
if (!typingTask.isTyping()) {
|
|
233
|
+
typingTask.start();
|
|
288
234
|
}
|
|
289
235
|
},
|
|
290
236
|
/**
|
|
291
237
|
* 清除打字任务
|
|
292
238
|
*/
|
|
293
239
|
clear: () => {
|
|
294
|
-
|
|
240
|
+
typingTask.stop();
|
|
295
241
|
charsRef.current = [];
|
|
296
242
|
setStableSegments([]);
|
|
297
243
|
setCurrentSegment(undefined);
|
|
298
244
|
isWholeTypedEndRef.current = false;
|
|
245
|
+
currentParagraphRef.current = undefined;
|
|
246
|
+
typingTask.clear();
|
|
247
|
+
lastSegmentRawRef.current = {
|
|
248
|
+
thinking: '',
|
|
249
|
+
answer: '',
|
|
250
|
+
thinkingReference: null,
|
|
251
|
+
answerReference: null,
|
|
252
|
+
};
|
|
299
253
|
},
|
|
300
254
|
/**
|
|
301
255
|
* 主动触发打字结束
|
|
302
256
|
*/
|
|
303
257
|
triggerWholeEnd: () => {
|
|
304
258
|
isWholeTypedEndRef.current = true;
|
|
305
|
-
if (!
|
|
306
|
-
triggerOnEnd
|
|
259
|
+
if (!typingTask.isTyping()) {
|
|
260
|
+
// 这里需要手动触发结束回调,因为 hook 中的 triggerOnEnd 不能直接调用
|
|
261
|
+
onEnd?.({
|
|
262
|
+
str: undefined,
|
|
263
|
+
answerType: undefined,
|
|
264
|
+
});
|
|
307
265
|
}
|
|
308
266
|
},
|
|
309
267
|
}));
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/MarkdownCMD/index.tsx"],"names":[],"mappings":";;;;;;AAAA,iCAA8F;AAE9F,wFAAyE;AACzE,4DAAoC;AAEpC,sDAAgD;AAChD,gDAAyC;
|
|
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
|
@@ -2,6 +2,18 @@
|
|
|
2
2
|
* 回答类型,思考和回答
|
|
3
3
|
*/
|
|
4
4
|
export type AnswerType = 'answer' | 'thinking';
|
|
5
|
+
/**
|
|
6
|
+
* 字符接口
|
|
7
|
+
*/
|
|
8
|
+
export interface IChar {
|
|
9
|
+
content: string;
|
|
10
|
+
answerType: AnswerType;
|
|
11
|
+
/**
|
|
12
|
+
* split_segment 两个连续的段落,需要做分割
|
|
13
|
+
*/
|
|
14
|
+
contentType: 'space' | 'segment' | 'split_segment';
|
|
15
|
+
tokenId: number;
|
|
16
|
+
}
|
|
5
17
|
/**
|
|
6
18
|
* 段落类型
|
|
7
19
|
* 段落类型为br时,表示换行
|
|
@@ -16,8 +28,16 @@ export interface IParagraph {
|
|
|
16
28
|
type: 'br' | 'text';
|
|
17
29
|
/** 回答类型 */
|
|
18
30
|
answerType: AnswerType;
|
|
31
|
+
/** token 参考 */
|
|
32
|
+
tokensReference: Record<string, ITokensReference>;
|
|
33
|
+
}
|
|
34
|
+
export interface ITokensReference {
|
|
35
|
+
startIndex: number;
|
|
36
|
+
raw: string;
|
|
19
37
|
}
|
|
20
38
|
export interface MarkdownProps {
|
|
39
|
+
/** 计时类型: 支持setTimeout和requestAnimationFrame */
|
|
40
|
+
timerType?: 'setTimeout' | 'requestAnimationFrame';
|
|
21
41
|
/** 打字机效果间隔时间 */
|
|
22
42
|
interval: number;
|
|
23
43
|
/** 是否关闭匀速打字机效果 */
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
import { AnswerType, IChar, MarkdownProps } from '../defined.js';
|
|
2
|
+
interface UseTypingTaskOptions {
|
|
3
|
+
timerType: MarkdownProps['timerType'];
|
|
4
|
+
interval: number;
|
|
5
|
+
charsRef: React.MutableRefObject<IChar[]>;
|
|
6
|
+
onEnd?: (data?: {
|
|
7
|
+
str?: string;
|
|
8
|
+
answerType?: AnswerType;
|
|
9
|
+
}) => void;
|
|
10
|
+
onStart?: (data?: {
|
|
11
|
+
currentIndex: number;
|
|
12
|
+
currentChar: string;
|
|
13
|
+
answerType: AnswerType;
|
|
14
|
+
prevStr: string;
|
|
15
|
+
}) => void;
|
|
16
|
+
onTypedChar?: (data?: {
|
|
17
|
+
currentIndex: number;
|
|
18
|
+
currentChar: string;
|
|
19
|
+
answerType: AnswerType;
|
|
20
|
+
prevStr: string;
|
|
21
|
+
}) => void;
|
|
22
|
+
processCharDisplay: (char: IChar) => void;
|
|
23
|
+
}
|
|
24
|
+
export interface TypingTaskController {
|
|
25
|
+
start: () => void;
|
|
26
|
+
stop: () => void;
|
|
27
|
+
clear: () => void;
|
|
28
|
+
isTyping: () => boolean;
|
|
29
|
+
}
|
|
30
|
+
export declare const useTypingTask: (options: UseTypingTaskOptions) => TypingTaskController;
|
|
31
|
+
export {};
|