ds-markdown 0.0.14-beta.0 → 0.0.14-beta.1

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 CHANGED
@@ -180,9 +180,9 @@ Let's explore these new features together!`);
180
180
  ### Imperative API (Recommended for Streaming Scenarios)
181
181
 
182
182
  ```typescript
183
- import { MarkdownCMD, MarkdownRef } from 'ds-markdown';
183
+ import { MarkdownCMD, MarkdownCMDRef } from 'ds-markdown';
184
184
 
185
- interface MarkdownRef {
185
+ interface MarkdownCMDRef {
186
186
  push: (content: string, answerType: AnswerType) => void;
187
187
  clear: () => void;
188
188
  triggerWholeEnd: () => void;
@@ -252,10 +252,10 @@ High-frequency recommends `requestAnimationFrame`, low-frequency recommends `set
252
252
 
253
253
  ````tsx
254
254
  import { useRef } from 'react';
255
- import { MarkdownCMD, MarkdownRef } from 'ds-markdown';
255
+ import { MarkdownCMD, MarkdownCMDRef } from 'ds-markdown';
256
256
 
257
257
  function StreamingChat() {
258
- const markdownRef = useRef<MarkdownRef>(null);
258
+ const markdownRef = useRef<MarkdownCMDRef>(null);
259
259
 
260
260
  // Simulate AI streaming response
261
261
  const simulateAIResponse = async () => {
@@ -382,7 +382,7 @@ const handleStreamingMarkdown = () => {
382
382
 
383
383
  ```tsx
384
384
  // ✅ Recommended: Imperative API
385
- const ref = useRef<MarkdownRef>(null);
385
+ const ref = useRef<MarkdownCMDRef>(null);
386
386
  useEffect(() => {
387
387
  ref.current?.push(newChunk, 'answer');
388
388
  }, [newChunk]);
@@ -395,9 +395,9 @@ const [content, setContent] = useState('');
395
395
  ### 3. Type Safety
396
396
 
397
397
  ```tsx
398
- import { MarkdownRef } from 'ds-markdown';
398
+ import { MarkdownCMDRef } from 'ds-markdown';
399
399
 
400
- const ref = useRef<MarkdownRef>(null);
400
+ const ref = useRef<MarkdownCMDRef>(null);
401
401
  // Complete TypeScript type hints
402
402
  ```
403
403
 
package/README.ja.md CHANGED
@@ -180,9 +180,9 @@ React 19 は多くのエキサイティングな新機能をもたらします
180
180
  ### 命令的 API(ストリーミングシナリオにおすすめ)
181
181
 
182
182
  ```typescript
183
- import { MarkdownCMD, MarkdownRef } from 'ds-markdown';
183
+ import { MarkdownCMD, MarkdownCMDRef } from 'ds-markdown';
184
184
 
185
- interface MarkdownRef {
185
+ interface MarkdownCMDRef {
186
186
  push: (content: string, answerType: AnswerType) => void;
187
187
  clear: () => void;
188
188
  triggerWholeEnd: () => void;
@@ -250,10 +250,10 @@ interface MarkdownRef {
250
250
 
251
251
  ````tsx
252
252
  import { useRef } from 'react';
253
- import { MarkdownCMD, MarkdownRef } from 'ds-markdown';
253
+ import { MarkdownCMD, MarkdownCMDRef } from 'ds-markdown';
254
254
 
255
255
  function StreamingChat() {
256
- const markdownRef = useRef<MarkdownRef>(null);
256
+ const markdownRef = useRef<MarkdownCMDRef>(null);
257
257
 
258
258
  // AI ストリーミング応答をシミュレート
259
259
  const simulateAIResponse = async () => {
@@ -380,7 +380,7 @@ const handleStreamingMarkdown = () => {
380
380
 
381
381
  ```tsx
382
382
  // ✅ 推奨:命令的 API
383
- const ref = useRef<MarkdownRef>(null);
383
+ const ref = useRef<MarkdownCMDRef>(null);
384
384
  useEffect(() => {
385
385
  ref.current?.push(newChunk, 'answer');
386
386
  }, [newChunk]);
@@ -393,9 +393,9 @@ const [content, setContent] = useState('');
393
393
  ### 3. 型安全
394
394
 
395
395
  ```tsx
396
- import { MarkdownRef } from 'ds-markdown';
396
+ import { MarkdownCMDRef } from 'ds-markdown';
397
397
 
398
- const ref = useRef<MarkdownRef>(null);
398
+ const ref = useRef<MarkdownCMDRef>(null);
399
399
  // 完全な TypeScript 型ヒント
400
400
  ```
401
401
 
package/README.ko.md CHANGED
@@ -180,9 +180,9 @@ React 19는 많은 흥미로운 새 기능을 제공합니다:
180
180
  ### 명령형 API (스트리밍 시나리오 추천)
181
181
 
182
182
  ```typescript
183
- import { MarkdownCMD, MarkdownRef } from 'ds-markdown';
183
+ import { MarkdownCMD, MarkdownCMDRef } from 'ds-markdown';
184
184
 
185
- interface MarkdownRef {
185
+ interface MarkdownCMDRef {
186
186
  push: (content: string, answerType: AnswerType) => void;
187
187
  clear: () => void;
188
188
  triggerWholeEnd: () => void;
@@ -250,10 +250,10 @@ interface MarkdownRef {
250
250
 
251
251
  ````tsx
252
252
  import { useRef } from 'react';
253
- import { MarkdownCMD, MarkdownRef } from 'ds-markdown';
253
+ import { MarkdownCMD, MarkdownCMDRef } from 'ds-markdown';
254
254
 
255
255
  function StreamingChat() {
256
- const markdownRef = useRef<MarkdownRef>(null);
256
+ const markdownRef = useRef<MarkdownCMDRef>(null);
257
257
 
258
258
  // AI 스트리밍 응답 시뮬레이션
259
259
  const simulateAIResponse = async () => {
@@ -380,7 +380,7 @@ const handleStreamingMarkdown = () => {
380
380
 
381
381
  ```tsx
382
382
  // ✅ 추천: 명령형 API
383
- const ref = useRef<MarkdownRef>(null);
383
+ const ref = useRef<MarkdownCMDRef>(null);
384
384
  useEffect(() => {
385
385
  ref.current?.push(newChunk, 'answer');
386
386
  }, [newChunk]);
@@ -393,9 +393,9 @@ const [content, setContent] = useState('');
393
393
  ### 3. 타입 안전성
394
394
 
395
395
  ```tsx
396
- import { MarkdownRef } from 'ds-markdown';
396
+ import { MarkdownCMDRef } from 'ds-markdown';
397
397
 
398
- const ref = useRef<MarkdownRef>(null);
398
+ const ref = useRef<MarkdownCMDRef>(null);
399
399
  // 완전한 TypeScript 타입 힌트
400
400
  ```
401
401
 
package/README.md CHANGED
@@ -38,6 +38,7 @@
38
38
  - 高频打字支持(`requestAnimationFrame`模式下打字间隔最低可接近于`0ms`)
39
39
  - 帧同步渲染,与浏览器 60fps 完美配合
40
40
  - 智能字符批量处理,视觉效果更自然
41
+ - 支持打字的中断 `stop` 和 继续`resume`
41
42
 
42
43
  ### 🔧 **灵活易用**
43
44
 
@@ -180,9 +181,9 @@ React 19 带来了许多激动人心的新特性:
180
181
  ### 命令式 API (推荐流式场景)
181
182
 
182
183
  ```typescript
183
- import { MarkdownCMD, MarkdownRef } from 'ds-markdown';
184
+ import { MarkdownCMD, MarkdownCMDRef } from 'ds-markdown';
184
185
 
185
- interface MarkdownRef {
186
+ interface MarkdownCMDRef {
186
187
  push: (content: string, answerType: AnswerType) => void;
187
188
  clear: () => void;
188
189
  triggerWholeEnd: () => void;
@@ -252,10 +253,10 @@ interface MarkdownRef {
252
253
 
253
254
  ````tsx
254
255
  import { useRef } from 'react';
255
- import { MarkdownCMD, MarkdownRef } from 'ds-markdown';
256
+ import { MarkdownCMD, MarkdownCMDRef } from 'ds-markdown';
256
257
 
257
258
  function StreamingChat() {
258
- const markdownRef = useRef<MarkdownRef>(null);
259
+ const markdownRef = useRef<MarkdownCMDRef>(null);
259
260
 
260
261
  // 模拟 AI 流式响应
261
262
  const simulateAIResponse = async () => {
@@ -382,7 +383,7 @@ const handleStreamingMarkdown = () => {
382
383
 
383
384
  ```tsx
384
385
  // ✅ 推荐:命令式 API
385
- const ref = useRef<MarkdownRef>(null);
386
+ const ref = useRef<MarkdownCMDRef>(null);
386
387
  useEffect(() => {
387
388
  ref.current?.push(newChunk, 'answer');
388
389
  }, [newChunk]);
@@ -395,9 +396,9 @@ const [content, setContent] = useState('');
395
396
  ### 3. 类型安全
396
397
 
397
398
  ```tsx
398
- import { MarkdownRef } from 'ds-markdown';
399
+ import { MarkdownCMDRef } from 'ds-markdown';
399
400
 
400
- const ref = useRef<MarkdownRef>(null);
401
+ const ref = useRef<MarkdownCMDRef>(null);
401
402
  // 完整的 TypeScript 类型提示
402
403
  ```
403
404
 
@@ -5,5 +5,5 @@ interface MarkdownImplProps extends MarkdownProps {
5
5
  answerType: AnswerType;
6
6
  theme?: Theme;
7
7
  }
8
- declare const _default: React.NamedExoticComponent<MarkdownImplProps>;
8
+ declare const _default: React.NamedExoticComponent<MarkdownImplProps & React.RefAttributes<import("../defined.js").MarkdownBaseRef>>;
9
9
  export default _default;
@@ -7,7 +7,7 @@ const jsx_runtime_1 = require("react/jsx-runtime");
7
7
  const react_1 = require("react");
8
8
  const constant_js_1 = require("../constant.js");
9
9
  const index_js_1 = __importDefault(require("../MarkdownCMD/index.js"));
10
- const MarkdownInner = ({ children: _children = '', answerType, onTypedChar, ...rest }) => {
10
+ const MarkdownInner = ({ children: _children = '', answerType, markdownRef, ...rest }) => {
11
11
  const cmdRef = (0, react_1.useRef)(null);
12
12
  const prefixRef = (0, react_1.useRef)('');
13
13
  const content = (0, react_1.useMemo)(() => {
@@ -38,9 +38,17 @@ const MarkdownInner = ({ children: _children = '', answerType, onTypedChar, ...r
38
38
  prefixRef.current = content;
39
39
  }
40
40
  }, [answerType, content]);
41
+ (0, react_1.useImperativeHandle)(markdownRef, () => ({
42
+ stop: () => {
43
+ cmdRef.current.stop();
44
+ },
45
+ resume: () => {
46
+ cmdRef.current.resume();
47
+ },
48
+ }));
41
49
  return (0, jsx_runtime_1.jsx)(index_js_1.default, { ref: cmdRef, ...rest });
42
50
  };
43
- const Markdown = (props) => {
51
+ const Markdown = (0, react_1.forwardRef)((props, ref) => {
44
52
  const { children = '', answerType = 'answer' } = props;
45
53
  if (constant_js_1.__DEV__) {
46
54
  if (!['thinking', 'answer'].includes(answerType)) {
@@ -50,7 +58,7 @@ const Markdown = (props) => {
50
58
  throw new Error('Markdown组件的子元素必须是一个字符串');
51
59
  }
52
60
  }
53
- return (0, jsx_runtime_1.jsx)(MarkdownInner, { ...props, answerType: answerType });
54
- };
61
+ return (0, jsx_runtime_1.jsx)(MarkdownInner, { ...props, answerType: answerType, markdownRef: ref });
62
+ });
55
63
  exports.default = (0, react_1.memo)(Markdown);
56
64
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/Markdown/index.tsx"],"names":[],"mappings":";;;;;;AAAA,iCAAgE;AAChE,gDAAyC;AAEzC,uEAAmE;AAQnE,MAAM,aAAa,GAAgC,CAAC,EAAE,QAAQ,EAAE,SAAS,GAAG,EAAE,EAAE,UAAU,EAAE,WAAW,EAAE,GAAG,IAAI,EAAE,EAAE,EAAE;IACpH,MAAM,MAAM,GAAG,IAAA,cAAM,EAAc,IAAK,CAAC,CAAC;IAC1C,MAAM,SAAS,GAAG,IAAA,cAAM,EAAC,EAAE,CAAC,CAAC;IAC7B,MAAM,OAAO,GAAG,IAAA,eAAO,EAAC,GAAG,EAAE;QAC3B,IAAI,OAAO,SAAS,KAAK,QAAQ,EAAE,CAAC;YAClC,OAAO,SAAS,CAAC;QACnB,CAAC;QACD,IAAI,qBAAO,EAAE,CAAC;YACZ,OAAO,CAAC,KAAK,CAAC,wBAAwB,CAAC,CAAC;QAC1C,CAAC;QACD,OAAO,EAAE,CAAC;IACZ,CAAC,EAAE,CAAC,SAAS,CAAC,CAAC,CAAC;IAEhB,IAAA,iBAAS,EAAC,GAAG,EAAE;QACb,IAAI,SAAS,CAAC,OAAO,KAAK,OAAO,EAAE,CAAC;YAClC,IAAI,UAAU,GAAG,EAAE,CAAC;YACpB,IAAI,SAAS,CAAC,OAAO,KAAK,EAAE,EAAE,CAAC;gBAC7B,UAAU,GAAG,OAAO,CAAC;YACvB,CAAC;iBAAM,CAAC;gBACN,IAAI,OAAO,CAAC,UAAU,CAAC,SAAS,CAAC,OAAO,CAAC,EAAE,CAAC;oBAC1C,UAAU,GAAG,OAAO,CAAC,KAAK,CAAC,SAAS,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;gBACvD,CAAC;qBAAM,CAAC;oBACN,UAAU,GAAG,OAAO,CAAC;oBACrB,MAAM,CAAC,OAAO,CAAC,KAAK,EAAE,CAAC;gBACzB,CAAC;YACH,CAAC;YACD,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,UAAU,EAAE,UAAU,CAAC,CAAC;YAC5C,SAAS,CAAC,OAAO,GAAG,OAAO,CAAC;QAC9B,CAAC;IACH,CAAC,EAAE,CAAC,UAAU,EAAE,OAAO,CAAC,CAAC,CAAC;IAE1B,OAAO,uBAAC,kBAAW,IAAC,GAAG,EAAE,MAAM,KAAM,IAAI,GAAI,CAAC;AAChD,CAAC,CAAC;AAEF,MAAM,QAAQ,GAAgC,CAAC,KAAK,EAAE,EAAE;IACtD,MAAM,EAAE,QAAQ,GAAG,EAAE,EAAE,UAAU,GAAG,QAAQ,EAAE,GAAG,KAAK,CAAC;IAEvD,IAAI,qBAAO,EAAE,CAAC;QACZ,IAAI,CAAC,CAAC,UAAU,EAAE,QAAQ,CAAC,CAAC,QAAQ,CAAC,UAAU,CAAC,EAAE,CAAC;YACjD,MAAM,IAAI,KAAK,CAAC,yCAAyC,CAAC,CAAC;QAC7D,CAAC;QACD,IAAI,OAAO,QAAQ,KAAK,QAAQ,EAAE,CAAC;YACjC,MAAM,IAAI,KAAK,CAAC,wBAAwB,CAAC,CAAC;QAC5C,CAAC;IACH,CAAC;IAED,OAAO,uBAAC,aAAa,OAAK,KAAK,EAAE,UAAU,EAAE,UAAU,GAAI,CAAC;AAC9D,CAAC,CAAC;AAEF,kBAAe,IAAA,YAAI,EAAC,QAAQ,CAAC,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/Markdown/index.tsx"],"names":[],"mappings":";;;;;;AAAA,iCAAiG;AACjG,gDAAyC;AAEzC,uEAAkD;AAYlD,MAAM,aAAa,GAAiC,CAAC,EAAE,QAAQ,EAAE,SAAS,GAAG,EAAE,EAAE,UAAU,EAAE,WAAW,EAAE,GAAG,IAAI,EAAE,EAAE,EAAE;IACrH,MAAM,MAAM,GAAG,IAAA,cAAM,EAAiB,IAAK,CAAC,CAAC;IAC7C,MAAM,SAAS,GAAG,IAAA,cAAM,EAAC,EAAE,CAAC,CAAC;IAC7B,MAAM,OAAO,GAAG,IAAA,eAAO,EAAC,GAAG,EAAE;QAC3B,IAAI,OAAO,SAAS,KAAK,QAAQ,EAAE,CAAC;YAClC,OAAO,SAAS,CAAC;QACnB,CAAC;QACD,IAAI,qBAAO,EAAE,CAAC;YACZ,OAAO,CAAC,KAAK,CAAC,wBAAwB,CAAC,CAAC;QAC1C,CAAC;QACD,OAAO,EAAE,CAAC;IACZ,CAAC,EAAE,CAAC,SAAS,CAAC,CAAC,CAAC;IAEhB,IAAA,iBAAS,EAAC,GAAG,EAAE;QACb,IAAI,SAAS,CAAC,OAAO,KAAK,OAAO,EAAE,CAAC;YAClC,IAAI,UAAU,GAAG,EAAE,CAAC;YACpB,IAAI,SAAS,CAAC,OAAO,KAAK,EAAE,EAAE,CAAC;gBAC7B,UAAU,GAAG,OAAO,CAAC;YACvB,CAAC;iBAAM,CAAC;gBACN,IAAI,OAAO,CAAC,UAAU,CAAC,SAAS,CAAC,OAAO,CAAC,EAAE,CAAC;oBAC1C,UAAU,GAAG,OAAO,CAAC,KAAK,CAAC,SAAS,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;gBACvD,CAAC;qBAAM,CAAC;oBACN,UAAU,GAAG,OAAO,CAAC;oBACrB,MAAM,CAAC,OAAO,CAAC,KAAK,EAAE,CAAC;gBACzB,CAAC;YACH,CAAC;YACD,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,UAAU,EAAE,UAAU,CAAC,CAAC;YAC5C,SAAS,CAAC,OAAO,GAAG,OAAO,CAAC;QAC9B,CAAC;IACH,CAAC,EAAE,CAAC,UAAU,EAAE,OAAO,CAAC,CAAC,CAAC;IAE1B,IAAA,2BAAmB,EAAC,WAAW,EAAE,GAAG,EAAE,CAAC,CAAC;QACtC,IAAI,EAAE,GAAG,EAAE;YACT,MAAM,CAAC,OAAO,CAAC,IAAI,EAAE,CAAC;QACxB,CAAC;QACD,MAAM,EAAE,GAAG,EAAE;YACX,MAAM,CAAC,OAAO,CAAC,MAAM,EAAE,CAAC;QAC1B,CAAC;KACF,CAAC,CAAC,CAAC;IAEJ,OAAO,uBAAC,kBAAW,IAAC,GAAG,EAAE,MAAM,KAAM,IAAI,GAAI,CAAC;AAChD,CAAC,CAAC;AAEF,MAAM,QAAQ,GAAG,IAAA,kBAAU,EAAiC,CAAC,KAAK,EAAE,GAAG,EAAE,EAAE;IACzE,MAAM,EAAE,QAAQ,GAAG,EAAE,EAAE,UAAU,GAAG,QAAQ,EAAE,GAAG,KAAK,CAAC;IAEvD,IAAI,qBAAO,EAAE,CAAC;QACZ,IAAI,CAAC,CAAC,UAAU,EAAE,QAAQ,CAAC,CAAC,QAAQ,CAAC,UAAU,CAAC,EAAE,CAAC;YACjD,MAAM,IAAI,KAAK,CAAC,yCAAyC,CAAC,CAAC;QAC7D,CAAC;QACD,IAAI,OAAO,QAAQ,KAAK,QAAQ,EAAE,CAAC;YACjC,MAAM,IAAI,KAAK,CAAC,wBAAwB,CAAC,CAAC;QAC5C,CAAC;IACH,CAAC;IAED,OAAO,uBAAC,aAAa,OAAK,KAAK,EAAE,UAAU,EAAE,UAAU,EAAE,WAAW,EAAE,GAAG,GAAI,CAAC;AAChF,CAAC,CAAC,CAAC;AAEH,kBAAe,IAAA,YAAI,EAAC,QAAQ,CAAC,CAAC"}
@@ -1,8 +1,3 @@
1
- import { AnswerType, MarkdownProps } from '../defined.js';
2
- export interface MarkdownRef {
3
- push: (content: string, answerType: AnswerType) => void;
4
- clear: () => void;
5
- triggerWholeEnd: () => void;
6
- }
7
- declare const MarkdownCMD: import("react").ForwardRefExoticComponent<MarkdownProps & import("react").RefAttributes<MarkdownRef>>;
1
+ import { MarkdownProps, MarkdownCMDRef } from '../defined.js';
2
+ declare const MarkdownCMD: import("react").ForwardRefExoticComponent<MarkdownProps & import("react").RefAttributes<MarkdownCMDRef>>;
8
3
  export default MarkdownCMD;
@@ -7,9 +7,7 @@ const jsx_runtime_1 = require("react/jsx-runtime");
7
7
  const react_1 = require("react");
8
8
  const index_js_1 = __importDefault(require("../components/HighReactMarkdown/index.js"));
9
9
  const classnames_1 = __importDefault(require("classnames"));
10
- const compiler_js_1 = require("../utils/compiler.js");
11
10
  const constant_js_1 = require("../constant.js");
12
- const deepClone_js_1 = __importDefault(require("../utils/methods/deepClone.js"));
13
11
  const useTypingTask_js_1 = require("../hooks/useTypingTask.js");
14
12
  const MarkdownCMD = (0, react_1.forwardRef)(({ interval = 30, onEnd, onStart, onTypedChar, timerType = 'setTimeout', theme = 'light' }, ref) => {
15
13
  /** 当前需要打字的内容 */
@@ -19,15 +17,7 @@ const MarkdownCMD = (0, react_1.forwardRef)(({ interval = 30, onEnd, onStart, on
19
17
  * 如果打字已经完全结束,则不会再触发打字效果
20
18
  */
21
19
  const isWholeTypedEndRef = (0, react_1.useRef)(false);
22
- /**
23
- * 稳定段落
24
- * 稳定段落是已经打过字,并且不会再变化的段落
25
- */
26
- const stableSegmentsRef = (0, react_1.useRef)([]);
27
- const stableSegments = stableSegmentsRef.current;
28
- /** 当前段落引用 */
29
- const currentParagraphRef = (0, react_1.useRef)(undefined);
30
- const currentSegment = currentParagraphRef.current;
20
+ const charIndexRef = (0, react_1.useRef)(0);
31
21
  /** 整个内容引用 */
32
22
  const wholeContentRef = (0, react_1.useRef)({
33
23
  thinking: {
@@ -38,8 +28,8 @@ const MarkdownCMD = (0, react_1.forwardRef)(({ interval = 30, onEnd, onStart, on
38
28
  content: '',
39
29
  length: 0,
40
30
  },
31
+ allLength: 0,
41
32
  });
42
- /** 触发更新 */
43
33
  const [, setUpdate] = (0, react_1.useState)(false);
44
34
  const triggerUpdate = () => {
45
35
  setUpdate((prev) => !prev);
@@ -48,66 +38,16 @@ const MarkdownCMD = (0, react_1.forwardRef)(({ interval = 30, onEnd, onStart, on
48
38
  * 处理字符显示逻辑
49
39
  */
50
40
  const processCharDisplay = (char) => {
51
- const currentSegment = currentParagraphRef.current;
52
- // debugger;
53
- /** 如果碰到 space,和split_segment 则需要处理成两个段落 */
54
- if (char.contentType === 'space' || char.contentType === 'split_segment') {
55
- if (currentSegment) {
56
- const newStableSegments = [...stableSegmentsRef.current];
57
- // 放入到稳定队列
58
- if (currentSegment) {
59
- newStableSegments.push({ ...currentSegment, isTyped: false });
60
- }
61
- stableSegmentsRef.current = newStableSegments;
62
- currentParagraphRef.current = undefined;
63
- triggerUpdate();
64
- }
65
- return;
66
- }
67
- // 处理当前段落
68
- const newCurrentParagraph = {
69
- content: '',
70
- isTyped: false,
71
- type: 'text',
72
- answerType: char.answerType,
73
- tokensReference: {},
74
- };
75
- let _currentParagraph = currentSegment;
76
- if (!_currentParagraph) {
77
- // 如果当前没有段落,则直接设置为新当前段落
78
- _currentParagraph = newCurrentParagraph;
79
- }
80
- else if (currentSegment && currentSegment?.answerType !== char.answerType) {
81
- // 如果当前段落和当前字符的回答类型不一致,则需要处理成两个段落
82
- const newStableSegments = [...stableSegmentsRef.current];
83
- newStableSegments.push({ ...currentSegment, isTyped: false });
84
- stableSegmentsRef.current = newStableSegments;
85
- _currentParagraph = newCurrentParagraph;
86
- }
87
- const tokensReference = (0, deepClone_js_1.default)(_currentParagraph.tokensReference);
88
- if (tokensReference[char.tokenId]) {
89
- tokensReference[char.tokenId].raw += char.content;
90
- tokensReference[char.tokenId].startIndex = currentSegment?.content?.length || 0;
41
+ if (char.answerType === 'thinking') {
42
+ wholeContentRef.current.thinking.content += char.content;
43
+ wholeContentRef.current.thinking.length += 1;
91
44
  }
92
45
  else {
93
- tokensReference[char.tokenId] = {
94
- startIndex: currentSegment?.content?.length || 0,
95
- raw: char.content,
96
- };
46
+ wholeContentRef.current.answer.content += char.content;
47
+ wholeContentRef.current.answer.length += 1;
97
48
  }
98
- const newCurrentSegment = {
99
- ..._currentParagraph,
100
- tokensReference,
101
- content: (currentSegment?.content || '') + char.content,
102
- isTyped: true,
103
- };
104
- currentParagraphRef.current = newCurrentSegment;
105
49
  triggerUpdate();
106
50
  };
107
- /** 思考段落 */
108
- const thinkingParagraphs = (0, react_1.useMemo)(() => stableSegments.filter((paragraph) => paragraph.answerType === 'thinking'), [stableSegments]);
109
- /** 回答段落 */
110
- const answerParagraphs = (0, react_1.useMemo)(() => stableSegments.filter((paragraph) => paragraph.answerType === 'answer'), [stableSegments]);
111
51
  // 使用新的打字任务 hook
112
52
  const typingTask = (0, useTypingTask_js_1.useTypingTask)({
113
53
  timerType,
@@ -119,10 +59,6 @@ const MarkdownCMD = (0, react_1.forwardRef)(({ interval = 30, onEnd, onStart, on
119
59
  processCharDisplay,
120
60
  wholeContentRef,
121
61
  });
122
- const lastSegmentRawRef = (0, react_1.useRef)({
123
- thinkingReference: null,
124
- answerReference: null,
125
- });
126
62
  /**
127
63
  * 内部推送处理逻辑
128
64
  */
@@ -130,103 +66,18 @@ const MarkdownCMD = (0, react_1.forwardRef)(({ interval = 30, onEnd, onStart, on
130
66
  if (content.length === 0) {
131
67
  return;
132
68
  }
133
- const lastSegmentReference = lastSegmentRawRef.current[`${answerType}Reference`];
134
- if (isWholeTypedEndRef.current) {
135
- if (constant_js_1.__DEV__) {
136
- console.warn('打字已经完全结束,不能再添加新的内容');
137
- }
138
- return;
139
- }
140
- const wholeContent = wholeContentRef.current[`${answerType}`] || '';
141
- let currentIndex = wholeContent.length;
142
- let currentLastSegmentReference = null;
143
- let currentLastSegmentRaw = '';
144
- let lastSegmentRaw = '';
145
- if (lastSegmentReference) {
146
- lastSegmentRaw = lastSegmentReference.raw;
147
- currentLastSegmentRaw = lastSegmentRaw + content;
148
- }
149
- else {
150
- currentLastSegmentRaw = content;
151
- }
152
- const tokens = (0, compiler_js_1.compiler)(currentLastSegmentRaw);
153
- // 如果最后一个token是space,则把lastSegmentRaw设置为空
154
- if (tokens[tokens.length - 1].type === 'space') {
155
- currentLastSegmentReference = null;
156
- }
157
- else {
158
- // 如果上一个segment存在并且当前只有一个token,则说明是同一个segment
159
- if (lastSegmentReference !== null && tokens.length === 1) {
160
- const newCurrentLastSegmentReference = lastSegmentReference;
161
- newCurrentLastSegmentReference.raw = newCurrentLastSegmentReference.raw + content;
162
- currentLastSegmentReference = newCurrentLastSegmentReference;
163
- }
164
- else {
165
- currentLastSegmentReference = tokens[tokens.length - 1];
166
- }
167
- }
168
- const pushAndSplitSegment = (raw, tokenIndex, segmentTokenId) => {
169
- const currentToken = tokens[tokenIndex];
170
- if (tokenIndex > 0) {
171
- const prevToken = tokens[tokenIndex - 1];
172
- if (prevToken.type !== 'space' && currentToken.type !== 'space') {
173
- charsRef.current.push({ content: '', answerType, contentType: 'split_segment', tokenId: currentToken.id, index: currentIndex++ });
174
- }
175
- }
176
- charsRef.current.push(...raw.split('').map((char) => ({ content: char, answerType, contentType: 'segment', tokenId: segmentTokenId, index: currentIndex++ })));
177
- };
178
- if (!lastSegmentReference) {
179
- tokens.forEach((token, i) => {
180
- if (token.type === 'space') {
181
- charsRef.current.push(...token.raw.split('').map((char) => ({ content: char, answerType, contentType: 'space', tokenId: token.id, index: currentIndex++ })));
182
- }
183
- else {
184
- pushAndSplitSegment(token.raw, i, token.id);
185
- }
186
- });
187
- }
188
- else {
189
- // debugger;
190
- let str = '';
191
- let nextTokenIndex = lastSegmentRaw.length;
192
- for (let i = 0; i < tokens.length; i++) {
193
- const token = tokens[i];
194
- if (token.type === 'space') {
195
- charsRef.current.push(...token.raw.split('').map((char) => ({ content: char, answerType, contentType: 'space', tokenId: token.id, index: currentIndex++ })));
196
- str += token.raw;
197
- }
198
- else {
199
- str += token.raw;
200
- if (str.length < nextTokenIndex && i == 0) {
201
- /** 如果当前字符串长度小于下一个token的索引,则需要将当前段落更新, 以修正不完整的token */
202
- const lastSegmentReferenceId = lastSegmentReference.id;
203
- const currentSegment = currentParagraphRef.current;
204
- const tokensReference = currentSegment?.tokensReference || {};
205
- const lastTokenReference = tokensReference[lastSegmentReferenceId];
206
- if (lastTokenReference) {
207
- const newTokensReference = { [lastSegmentReferenceId]: { startIndex: lastTokenReference.startIndex, raw: token.raw } };
208
- // 去除charsRef中 tokenId = lastSegmentReferenceId 的字符
209
- charsRef.current = charsRef.current.filter((char) => char.tokenId !== lastSegmentReferenceId);
210
- const newCurrentSegment = { ...currentSegment, tokensReference: newTokensReference, isTyped: false, type: 'text', answerType };
211
- newCurrentSegment.content = Object.values(newTokensReference).reduce((acc, curr) => acc + curr.raw, '');
212
- currentParagraphRef.current = newCurrentSegment;
213
- triggerUpdate();
214
- }
215
- else {
216
- // TODO
217
- }
218
- }
219
- const realRaw = str.slice(nextTokenIndex);
220
- if (realRaw.length > 0) {
221
- pushAndSplitSegment(realRaw, i, lastSegmentReference.id);
222
- }
223
- }
224
- nextTokenIndex = str.length;
225
- }
226
- }
227
- lastSegmentRawRef.current[`${answerType}Reference`] = currentLastSegmentReference;
228
- wholeContent.content = wholeContent.content + content;
229
- wholeContent.length = wholeContent.content.length;
69
+ charsRef.current.push(...content.split('').map((chatStr) => {
70
+ const index = charIndexRef.current++;
71
+ const charObj = {
72
+ content: chatStr,
73
+ answerType,
74
+ contentType: 'segment',
75
+ tokenId: 0,
76
+ index,
77
+ };
78
+ return charObj;
79
+ }));
80
+ wholeContentRef.current.allLength += content.length;
230
81
  if (!typingTask.isTyping()) {
231
82
  typingTask.start();
232
83
  }
@@ -245,20 +96,31 @@ const MarkdownCMD = (0, react_1.forwardRef)(({ interval = 30, onEnd, onStart, on
245
96
  */
246
97
  clear: () => {
247
98
  typingTask.stop();
99
+ typingTask.typedIsManualStopRef.current = false;
248
100
  charsRef.current = [];
101
+ wholeContentRef.current = {
102
+ thinking: {
103
+ content: '',
104
+ length: 0,
105
+ },
106
+ answer: {
107
+ content: '',
108
+ length: 0,
109
+ },
110
+ allLength: 0,
111
+ };
249
112
  isWholeTypedEndRef.current = false;
250
- currentParagraphRef.current = undefined;
251
- typingTask.clear();
252
- // 清理缓冲区
253
- const lastSegmentRef = lastSegmentRawRef.current;
254
- lastSegmentRef.thinkingReference = null;
255
- lastSegmentRef.answerReference = null;
256
- wholeContentRef.current.thinking.content = '';
257
- wholeContentRef.current.thinking.length = 0;
258
- wholeContentRef.current.answer.content = '';
259
- wholeContentRef.current.answer.length = 0;
113
+ charIndexRef.current = 0;
260
114
  triggerUpdate();
261
115
  },
116
+ /** 停止打字任务 */
117
+ stop: () => {
118
+ typingTask.stop();
119
+ },
120
+ /** 重新开始打字任务 */
121
+ resume: () => {
122
+ typingTask.resume();
123
+ },
262
124
  /**
263
125
  * 主动触发打字结束
264
126
  */
@@ -276,19 +138,14 @@ const MarkdownCMD = (0, react_1.forwardRef)(({ interval = 30, onEnd, onStart, on
276
138
  * 刷新缓冲区 (新增方法)
277
139
  */
278
140
  }));
279
- const getParagraphs = (paragraphs, answerType) => {
280
- return ((0, jsx_runtime_1.jsxs)("div", { className: `ds-markdown-paragraph ds-typed-${answerType}`, children: [paragraphs.map((paragraph, index) => {
281
- if (paragraph.type === 'br') {
282
- return null;
283
- }
284
- return ((0, jsx_runtime_1.jsx)(index_js_1.default, { theme: theme, children: paragraph.content || '' }, index));
285
- }), currentSegment?.answerType === answerType && ((0, jsx_runtime_1.jsx)(index_js_1.default, { theme: theme, children: currentSegment.content || '' }, currentSegment.content))] }));
141
+ const getParagraphs = (answerType) => {
142
+ 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, children: wholeContentRef.current[answerType].content || '' }) }));
286
143
  };
287
144
  return ((0, jsx_runtime_1.jsxs)("div", { className: (0, classnames_1.default)({
288
145
  'ds-markdown': true,
289
146
  apple: true,
290
147
  'ds-markdown-dark': theme === 'dark',
291
- }), children: [(thinkingParagraphs.length > 0 || currentSegment?.answerType === 'thinking') && (0, jsx_runtime_1.jsx)("div", { className: "ds-markdown-thinking", children: getParagraphs(thinkingParagraphs, 'thinking') }), (answerParagraphs.length > 0 || currentSegment?.answerType === 'answer') && (0, jsx_runtime_1.jsx)("div", { className: "ds-markdown-answer", children: getParagraphs(answerParagraphs, 'answer') })] }));
148
+ }), children: [(0, jsx_runtime_1.jsx)("div", { className: "ds-markdown-thinking", children: getParagraphs('thinking') }), (0, jsx_runtime_1.jsx)("div", { className: "ds-markdown-answer", children: getParagraphs('answer') })] }));
292
149
  });
293
150
  if (constant_js_1.__DEV__) {
294
151
  MarkdownCMD.displayName = 'MarkdownCMD';
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/MarkdownCMD/index.tsx"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/MarkdownCMD/index.tsx"],"names":[],"mappings":"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"}
@@ -79,4 +79,17 @@ export interface IWholeContent {
79
79
  content: string;
80
80
  length: number;
81
81
  };
82
+ allLength: number;
83
+ }
84
+ export interface MarkdownBaseRef {
85
+ stop: () => void;
86
+ resume: () => void;
87
+ }
88
+ /** Markdown 组件的ref 类型 */
89
+ export type MarkdownRef = MarkdownBaseRef;
90
+ /** MarkdownCMD 组件的 ref 类型 */
91
+ export interface MarkdownCMDRef extends MarkdownBaseRef {
92
+ push: (content: string, answerType: AnswerType) => void;
93
+ clear: () => void;
94
+ triggerWholeEnd: () => void;
82
95
  }
@@ -6,6 +6,7 @@ interface UseTypingTaskOptions {
6
6
  onEnd?: (data?: {
7
7
  str?: string;
8
8
  answerType?: AnswerType;
9
+ manual: boolean;
9
10
  }) => void;
10
11
  onStart?: (data?: {
11
12
  currentIndex: number;
@@ -22,6 +23,9 @@ export interface TypingTaskController {
22
23
  stop: () => void;
23
24
  clear: () => void;
24
25
  isTyping: () => boolean;
26
+ /** 是否主动调用 stop 方法 */
27
+ typedIsManualStopRef: React.RefObject<boolean>;
28
+ resume: () => void;
25
29
  }
26
30
  export declare const useTypingTask: (options: UseTypingTaskOptions) => TypingTaskController;
27
31
  export {};