react-markdown-typer 1.0.0-beta.1 → 1.0.0-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 +126 -130
- package/README.zh.md +118 -121
- package/es/Markdown/index.d.ts.map +1 -1
- package/es/Markdown/index.js +3 -0
- package/es/Markdown/index.js.map +1 -1
- package/es/MarkdownCMD/index.d.ts.map +1 -1
- package/es/MarkdownCMD/index.js +10 -5
- package/es/MarkdownCMD/index.js.map +1 -1
- package/es/defined.d.ts +13 -2
- package/es/defined.d.ts.map +1 -1
- package/es/hooks/useTypingTask.d.ts +2 -2
- package/es/hooks/useTypingTask.d.ts.map +1 -1
- package/es/hooks/useTypingTask.js +56 -7
- package/es/hooks/useTypingTask.js.map +1 -1
- package/es/utils/grapheme.d.ts +2 -0
- package/es/utils/grapheme.d.ts.map +1 -0
- package/es/utils/grapheme.js +4 -0
- package/es/utils/grapheme.js.map +1 -0
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -59,7 +59,7 @@ A React component designed for modern AI applications, providing smooth real-tim
|
|
|
59
59
|
- [🚀 5-Minute Quick Start](#-5-minute-quick-start)
|
|
60
60
|
- [Basic Usage](#basic-usage)
|
|
61
61
|
- [Disable Typing Animation](#disable-typing-animation)
|
|
62
|
-
- [
|
|
62
|
+
- [Custom Markdown Processing](#custom-markdown-processing)
|
|
63
63
|
- [AI Chat Scenario](#ai-chat-scenario)
|
|
64
64
|
- [🎯 Advanced Callback Control](#-advanced-callback-control)
|
|
65
65
|
- [🔄 Restart Animation Demo](#-restart-animation-demo)
|
|
@@ -68,16 +68,16 @@ A React component designed for modern AI applications, providing smooth real-tim
|
|
|
68
68
|
- [Default Exported Props for MarkdownTyper and MarkdownCMD](#default-exported-props-for-markdowntyper-and-markdowncmd)
|
|
69
69
|
- [IBeforeTypedChar](#ibeforetypedchar)
|
|
70
70
|
- [ITypedChar](#itypedchar)
|
|
71
|
-
- [
|
|
71
|
+
- [Custom Markdown Conversion](#custom-markdown-conversion)
|
|
72
72
|
- [IMarkdownPlugin](#imarkdownplugin)
|
|
73
73
|
- [Exposed Methods](#exposed-methods)
|
|
74
74
|
- [Default Export MarkdownTyper](#default-export-markdowntyper)
|
|
75
75
|
- [MarkdownCMD Exposed Methods](#markdowncmd-exposed-methods)
|
|
76
|
-
- [
|
|
77
|
-
- [Basic
|
|
78
|
-
- [
|
|
79
|
-
- [
|
|
80
|
-
- [
|
|
76
|
+
- [🔧 Custom Markdown Processing Guide](#-custom-markdown-processing-guide)
|
|
77
|
+
- [Basic Usage](#basic-usage-1)
|
|
78
|
+
- [Advanced Processing](#advanced-processing)
|
|
79
|
+
- [Integration with External Processors](#integration-with-external-processors)
|
|
80
|
+
- [Content Filtering](#content-filtering)
|
|
81
81
|
- [🔌 Plugin System](#-plugin-system)
|
|
82
82
|
- [🎛️ Timer Modes Explained](#️-timer-modes-explained)
|
|
83
83
|
- [`requestAnimationFrame` Mode 🌟 (Recommended)](#requestanimationframe-mode--recommended)
|
|
@@ -85,7 +85,7 @@ A React component designed for modern AI applications, providing smooth real-tim
|
|
|
85
85
|
- [📊 Performance Comparison](#-performance-comparison)
|
|
86
86
|
- [💡 Practical Examples](#-practical-examples)
|
|
87
87
|
- [📝 AI Streaming Chat](#-ai-streaming-chat)
|
|
88
|
-
- [
|
|
88
|
+
- [🔧 Custom Markdown Processing Demo](#-custom-markdown-processing-demo)
|
|
89
89
|
- [🎯 Advanced Callback Control](#-advanced-callback-control-1)
|
|
90
90
|
|
|
91
91
|
---
|
|
@@ -186,19 +186,23 @@ function StaticDemo() {
|
|
|
186
186
|
}
|
|
187
187
|
```
|
|
188
188
|
|
|
189
|
-
###
|
|
189
|
+
### Custom Markdown Processing
|
|
190
190
|
|
|
191
191
|
```tsx
|
|
192
192
|
import MarkdownTyper from 'react-markdown-typer';
|
|
193
|
-
// If you need to display formulas, import the formula plugins
|
|
194
|
-
import remarkMath from 'remark-math';
|
|
195
|
-
import rehypeKatex from 'rehype-katex';
|
|
196
193
|
|
|
197
|
-
function
|
|
194
|
+
function CustomMarkdownDemo() {
|
|
195
|
+
const customConvertMarkdownString = (markdownString) => {
|
|
196
|
+
// Custom processing logic
|
|
197
|
+
return markdownString
|
|
198
|
+
.replace(/\[([^\]]+)\]\(([^)]+)\)/g, '<a href="$2" target="_blank">$1</a>') // Convert links
|
|
199
|
+
.replace(/\*\*([^*]+)\*\*/g, '<strong>$1</strong>') // Convert bold
|
|
200
|
+
.replace(/\*([^*]+)\*/g, '<em>$1</em>'); // Convert italic
|
|
201
|
+
};
|
|
202
|
+
|
|
198
203
|
return (
|
|
199
|
-
<MarkdownTyper interval={20}
|
|
200
|
-
#
|
|
201
|
-
hypotenuse For the classic "3-4-5 triangle": $c = \sqrt{3 ^ (2 + 4) ^ 2} = \sqrt{25} = 5$
|
|
204
|
+
<MarkdownTyper interval={20} customConvertMarkdownString={customConvertMarkdownString}>
|
|
205
|
+
# Custom Markdown Processing This is **bold text** and *italic text*. Check out [our website](https://example.com) for more info!
|
|
202
206
|
</MarkdownTyper>
|
|
203
207
|
);
|
|
204
208
|
}
|
|
@@ -464,18 +468,18 @@ function StartDemo() {
|
|
|
464
468
|
import MarkdownTyper, { MarkdownCMD } from 'react-markdown-typer';
|
|
465
469
|
```
|
|
466
470
|
|
|
467
|
-
| Prop
|
|
468
|
-
|
|
|
469
|
-
| `interval`
|
|
470
|
-
| `timerType`
|
|
471
|
-
| `theme`
|
|
472
|
-
| `
|
|
473
|
-
| `onEnd`
|
|
474
|
-
| `onStart`
|
|
475
|
-
| `onBeforeTypedChar`
|
|
476
|
-
| `onTypedChar`
|
|
477
|
-
| `disableTyping`
|
|
478
|
-
| `autoStartTyping`
|
|
471
|
+
| Prop | Type | Description | Default |
|
|
472
|
+
| ----------------------------- | ------------------------------------------- | ------------------------------------------------------------------------------------------------- | ----------------------------------------------------------------------------- |
|
|
473
|
+
| `interval` | `number` | Typing interval (ms) | `30` |
|
|
474
|
+
| `timerType` | `'setTimeout'` \| `'requestAnimationFrame'` | Timer type, not dynamically changeable | Default is `setTimeout`, will switch to `requestAnimationFrame` in the future |
|
|
475
|
+
| `theme` | `'light'` \| `'dark'` | Theme type | `'light'` |
|
|
476
|
+
| `customConvertMarkdownString` | `(markdownString: string) => string` | Custom markdown string conversion function | - |
|
|
477
|
+
| `onEnd` | `(data: EndData) => void` | Typing end callback | - |
|
|
478
|
+
| `onStart` | `(data: StartData) => void` | Typing start callback | - |
|
|
479
|
+
| `onBeforeTypedChar` | `(data: IBeforeTypedChar) => Promise<void>` | Callback before typing a character, supports async, blocks next typing | - |
|
|
480
|
+
| `onTypedChar` | `(data: ITypedChar) => void` | Callback after each character | - |
|
|
481
|
+
| `disableTyping` | `boolean` | Disable typing animation | `false` |
|
|
482
|
+
| `autoStartTyping` | `boolean` | Whether to auto start typing animation, set false to trigger manually, not dynamically changeable | `true` |
|
|
479
483
|
|
|
480
484
|
> Note: If `disableTyping` changes from `true` to `false` during typing, all remaining characters will be displayed at once on the next typing trigger.
|
|
481
485
|
|
|
@@ -498,16 +502,23 @@ import MarkdownTyper, { MarkdownCMD } from 'react-markdown-typer';
|
|
|
498
502
|
| `currentStr` | `string` | Full string of current type | - |
|
|
499
503
|
| `percent` | `number` | Typing progress percent (0-100) | `0` |
|
|
500
504
|
|
|
501
|
-
####
|
|
505
|
+
#### Custom Markdown Conversion
|
|
502
506
|
|
|
503
|
-
|
|
504
|
-
| ------------- | ------------------------- | --------------------------- | ---------- |
|
|
505
|
-
| `splitSymbol` | `'dollar'` \| `'bracket'` | Math formula delimiter type | `'dollar'` |
|
|
507
|
+
The `customConvertMarkdownString` function allows you to preprocess markdown content before it's rendered. This is useful for:
|
|
506
508
|
|
|
507
|
-
|
|
509
|
+
- Custom markdown syntax extensions
|
|
510
|
+
- Content filtering or sanitization
|
|
511
|
+
- Integration with external markdown processors
|
|
512
|
+
- Custom link handling or formatting
|
|
508
513
|
|
|
509
|
-
|
|
510
|
-
|
|
514
|
+
**Example:**
|
|
515
|
+
|
|
516
|
+
```tsx
|
|
517
|
+
const customConvertMarkdownString = (markdownString) => {
|
|
518
|
+
// Add custom processing logic here
|
|
519
|
+
return markdownString.replace(/\[([^\]]+)\]\(([^)]+)\)/g, '<a href="$2" target="_blank">$1</a>').replace(/\*\*([^*]+)\*\*/g, '<strong>$1</strong>');
|
|
520
|
+
};
|
|
521
|
+
```
|
|
511
522
|
|
|
512
523
|
#### IMarkdownPlugin
|
|
513
524
|
|
|
@@ -547,90 +558,77 @@ markdownRef.current?.restart(); // Restart animation
|
|
|
547
558
|
|
|
548
559
|
---
|
|
549
560
|
|
|
550
|
-
##
|
|
551
|
-
|
|
552
|
-
<!-- [DEMO1: Pythagorean Theorem](https://stackblitz.com/edit/vitejs-vite-z94syu8j?file=src%2FApp.tsx) -->
|
|
561
|
+
## 🔧 Custom Markdown Processing Guide
|
|
553
562
|
|
|
554
|
-
|
|
555
|
-
|
|
556
|
-
### Basic Syntax
|
|
563
|
+
### Basic Usage
|
|
557
564
|
|
|
558
565
|
```tsx
|
|
559
|
-
import
|
|
560
|
-
import rehypeKatex from 'rehype-katex';
|
|
561
|
-
|
|
562
|
-
// 1. Enable math formula support
|
|
563
|
-
<MarkdownTyper reactMarkdownProps={{ remarkPlugins: [remarkMath], rehypePlugins: [rehypeKatex]}}>
|
|
564
|
-
# Math Formula Example
|
|
566
|
+
import MarkdownTyper from 'react-markdown-typer';
|
|
565
567
|
|
|
566
|
-
|
|
567
|
-
|
|
568
|
+
function CustomMarkdownDemo() {
|
|
569
|
+
const customConvertMarkdownString = (markdownString) => {
|
|
570
|
+
// Add your custom processing logic here
|
|
571
|
+
return markdownString
|
|
572
|
+
.replace(/\[([^\]]+)\]\(([^)]+)\)/g, '<a href="$2" target="_blank">$1</a>')
|
|
573
|
+
.replace(/\*\*([^*]+)\*\*/g, '<strong>$1</strong>')
|
|
574
|
+
.replace(/\*([^*]+)\*/g, '<em>$1</em>');
|
|
575
|
+
};
|
|
568
576
|
|
|
569
|
-
|
|
570
|
-
|
|
571
|
-
|
|
577
|
+
return (
|
|
578
|
+
<MarkdownTyper interval={20} customConvertMarkdownString={customConvertMarkdownString}>
|
|
579
|
+
# Custom Markdown Processing This is **bold text** and *italic text*. Check out [our website](https://example.com) for more info!
|
|
580
|
+
</MarkdownTyper>
|
|
581
|
+
);
|
|
582
|
+
}
|
|
572
583
|
```
|
|
573
584
|
|
|
574
|
-
###
|
|
585
|
+
### Advanced Processing
|
|
575
586
|
|
|
576
|
-
|
|
577
|
-
//
|
|
578
|
-
|
|
579
|
-
|
|
580
|
-
|
|
581
|
-
|
|
582
|
-
|
|
583
|
-
|
|
584
|
-
</
|
|
585
|
-
|
|
586
|
-
|
|
587
|
-
|
|
588
|
-
|
|
589
|
-
|
|
590
|
-
|
|
591
|
-
|
|
592
|
-
|
|
593
|
-
|
|
594
|
-
|
|
587
|
+
````tsx
|
|
588
|
+
// Complex custom processing example
|
|
589
|
+
const customConvertMarkdownString = (markdownString) => {
|
|
590
|
+
return (
|
|
591
|
+
markdownString
|
|
592
|
+
// Custom emoji processing
|
|
593
|
+
.replace(/:([a-zA-Z0-9_]+):/g, '<span class="emoji">:$1:</span>')
|
|
594
|
+
// Custom mention processing
|
|
595
|
+
.replace(/@([a-zA-Z0-9_]+)/g, '<span class="mention">@$1</span>')
|
|
596
|
+
// Custom code block processing
|
|
597
|
+
.replace(/```(\w+)\n([\s\S]*?)```/g, '<pre class="code-block"><code class="language-$1">$2</code></pre>')
|
|
598
|
+
// Custom link processing with security
|
|
599
|
+
.replace(/\[([^\]]+)\]\(([^)]+)\)/g, (match, text, url) => {
|
|
600
|
+
if (url.startsWith('http')) {
|
|
601
|
+
return `<a href="${url}" target="_blank" rel="noopener noreferrer">${text}</a>`;
|
|
602
|
+
}
|
|
603
|
+
return match;
|
|
604
|
+
})
|
|
605
|
+
);
|
|
606
|
+
};
|
|
607
|
+
````
|
|
595
608
|
|
|
596
|
-
###
|
|
609
|
+
### Integration with External Processors
|
|
597
610
|
|
|
598
611
|
```tsx
|
|
599
|
-
|
|
600
|
-
|
|
601
|
-
|
|
602
|
-
|
|
603
|
-
|
|
604
|
-
|
|
605
|
-
|
|
606
|
-
|
|
607
|
-
|
|
608
|
-
'$c = \\sqrt{3^2 + 4^2} = \\sqrt{25} = 5$\n\n',
|
|
609
|
-
'This theorem has wide applications in geometry!',
|
|
610
|
-
];
|
|
611
|
-
|
|
612
|
-
mathContent.forEach((chunk) => {
|
|
613
|
-
markdownRef.current?.push(chunk, 'answer');
|
|
614
|
-
});
|
|
612
|
+
import { marked } from 'marked';
|
|
613
|
+
|
|
614
|
+
const customConvertMarkdownString = (markdownString) => {
|
|
615
|
+
// Use marked.js for processing
|
|
616
|
+
return marked(markdownString, {
|
|
617
|
+
breaks: true,
|
|
618
|
+
gfm: true,
|
|
619
|
+
});
|
|
620
|
+
};
|
|
615
621
|
```
|
|
616
622
|
|
|
617
|
-
###
|
|
618
|
-
|
|
619
|
-
```css
|
|
620
|
-
/* Math formula style customization */
|
|
621
|
-
.katex {
|
|
622
|
-
font-size: 1.1em;
|
|
623
|
-
}
|
|
623
|
+
### Content Filtering
|
|
624
624
|
|
|
625
|
-
|
|
626
|
-
|
|
627
|
-
|
|
628
|
-
|
|
625
|
+
```tsx
|
|
626
|
+
const customConvertMarkdownString = (markdownString) => {
|
|
627
|
+
// Filter out sensitive content
|
|
628
|
+
const filteredContent = markdownString.replace(/password[:\s]*[^\s]+/gi, 'password: [FILTERED]').replace(/token[:\s]*[^\s]+/gi, 'token: [FILTERED]');
|
|
629
629
|
|
|
630
|
-
|
|
631
|
-
|
|
632
|
-
color: #e1e1e1;
|
|
633
|
-
}
|
|
630
|
+
return filteredContent;
|
|
631
|
+
};
|
|
634
632
|
```
|
|
635
633
|
|
|
636
634
|
---
|
|
@@ -752,31 +750,35 @@ function StreamingChat() {
|
|
|
752
750
|
const delay = (ms: number) => new Promise((resolve) => setTimeout(resolve, ms));
|
|
753
751
|
````
|
|
754
752
|
|
|
755
|
-
###
|
|
753
|
+
### 🔧 Custom Markdown Processing Demo
|
|
756
754
|
|
|
757
755
|
```tsx
|
|
758
|
-
|
|
759
|
-
import rehypeKatex from 'rehype-katex';
|
|
760
|
-
|
|
761
|
-
function MathStreamingDemo() {
|
|
756
|
+
function CustomMarkdownStreamingDemo() {
|
|
762
757
|
const markdownRef = useRef<MarkdownCMDRef>(null);
|
|
763
758
|
|
|
764
|
-
const
|
|
759
|
+
const customConvertMarkdownString = (markdownString) => {
|
|
760
|
+
return markdownString
|
|
761
|
+
.replace(/\[([^\]]+)\]\(([^)]+)\)/g, '<a href="$2" target="_blank" rel="noopener noreferrer">$1</a>')
|
|
762
|
+
.replace(/\*\*([^*]+)\*\*/g, '<strong>$1</strong>')
|
|
763
|
+
.replace(/\*([^*]+)\*/g, '<em>$1</em>')
|
|
764
|
+
.replace(/`([^`]+)`/g, '<code>$1</code>');
|
|
765
|
+
};
|
|
766
|
+
|
|
767
|
+
const simulateCustomResponse = async () => {
|
|
765
768
|
markdownRef.current?.clear();
|
|
766
769
|
|
|
767
|
-
const
|
|
768
|
-
'#
|
|
769
|
-
'
|
|
770
|
-
'
|
|
771
|
-
'
|
|
772
|
-
'-
|
|
773
|
-
'-
|
|
774
|
-
'
|
|
775
|
-
'
|
|
776
|
-
'This theorem has wide applications in geometry!',
|
|
770
|
+
const customChunks = [
|
|
771
|
+
'# Custom Markdown Processing\n\n',
|
|
772
|
+
'This demo shows how to use **custom markdown processing** with streaming content:\n\n',
|
|
773
|
+
'## Features\n',
|
|
774
|
+
'- *Custom link handling*\n',
|
|
775
|
+
'- **Bold and italic** text processing\n',
|
|
776
|
+
'- `Inline code` formatting\n',
|
|
777
|
+
'- [External links](https://example.com) with security attributes\n\n',
|
|
778
|
+
'The `customConvertMarkdownString` function allows you to preprocess content before rendering!',
|
|
777
779
|
];
|
|
778
780
|
|
|
779
|
-
for (const chunk of
|
|
781
|
+
for (const chunk of customChunks) {
|
|
780
782
|
await delay(150);
|
|
781
783
|
markdownRef.current?.push(chunk, 'answer');
|
|
782
784
|
}
|
|
@@ -784,15 +786,9 @@ function MathStreamingDemo() {
|
|
|
784
786
|
|
|
785
787
|
return (
|
|
786
788
|
<div>
|
|
787
|
-
<button onClick={
|
|
788
|
-
|
|
789
|
-
<MarkdownCMD
|
|
790
|
-
ref={markdownRef}
|
|
791
|
-
interval={20}
|
|
792
|
-
timerType="requestAnimationFrame"
|
|
793
|
-
reactMarkdownProps={{ remarkPlugins: [remarkMath], rehypePlugins: [rehypeKatex] }}
|
|
794
|
-
math={{ splitSymbol: 'dollar' }}
|
|
795
|
-
/>
|
|
789
|
+
<button onClick={simulateCustomResponse}>🔧 Custom Markdown Demo</button>
|
|
790
|
+
|
|
791
|
+
<MarkdownCMD ref={markdownRef} interval={20} timerType="requestAnimationFrame" customConvertMarkdownString={customConvertMarkdownString} />
|
|
796
792
|
</div>
|
|
797
793
|
);
|
|
798
794
|
}
|
package/README.zh.md
CHANGED
|
@@ -155,18 +155,23 @@ function StaticDemo() {
|
|
|
155
155
|
}
|
|
156
156
|
```
|
|
157
157
|
|
|
158
|
-
###
|
|
158
|
+
### 自定义 Markdown 处理
|
|
159
159
|
|
|
160
160
|
```tsx
|
|
161
161
|
import MarkdownTyper from 'react-markdown-typer';
|
|
162
|
-
// 如果需要展示公式,则需要引入公式转换插件
|
|
163
|
-
import remarkMath from 'remark-math';
|
|
164
|
-
import rehypeKatex from 'rehype-katex';
|
|
165
162
|
|
|
166
|
-
function
|
|
163
|
+
function CustomMarkdownDemo() {
|
|
164
|
+
const customConvertMarkdownString = (markdownString) => {
|
|
165
|
+
// 自定义处理逻辑
|
|
166
|
+
return markdownString
|
|
167
|
+
.replace(/\[([^\]]+)\]\(([^)]+)\)/g, '<a href="$2" target="_blank">$1</a>') // 转换链接
|
|
168
|
+
.replace(/\*\*([^*]+)\*\*/g, '<strong>$1</strong>') // 转换粗体
|
|
169
|
+
.replace(/\*([^*]+)\*/g, '<em>$1</em>'); // 转换斜体
|
|
170
|
+
};
|
|
171
|
+
|
|
167
172
|
return (
|
|
168
|
-
<MarkdownTyper interval={20}
|
|
169
|
-
#
|
|
173
|
+
<MarkdownTyper interval={20} customConvertMarkdownString={customConvertMarkdownString}>
|
|
174
|
+
# 自定义 Markdown 处理 这是**粗体文字**和*斜体文字*。查看[我们的网站](https://example.com)了解更多信息!
|
|
170
175
|
</MarkdownTyper>
|
|
171
176
|
);
|
|
172
177
|
}
|
|
@@ -432,18 +437,18 @@ function StartDemo() {
|
|
|
432
437
|
import MarkdownTyper, { MarkdownCMD } from 'react-markdown-typer';
|
|
433
438
|
```
|
|
434
439
|
|
|
435
|
-
| 属性
|
|
436
|
-
|
|
|
437
|
-
| `interval`
|
|
438
|
-
| `timerType`
|
|
439
|
-
| `theme`
|
|
440
|
-
| `
|
|
441
|
-
| `onEnd`
|
|
442
|
-
| `onStart`
|
|
443
|
-
| `onBeforeTypedChar`
|
|
444
|
-
| `onTypedChar`
|
|
445
|
-
| `disableTyping`
|
|
446
|
-
| `autoStartTyping`
|
|
440
|
+
| 属性 | 类型 | 说明 | 默认值 |
|
|
441
|
+
| ----------------------------- | ------------------------------------------- | ------------------------------------------------------------- | ----------------------------------------------------------- |
|
|
442
|
+
| `interval` | `number` | 打字间隔 (毫秒) | `30` |
|
|
443
|
+
| `timerType` | `'setTimeout'` \| `'requestAnimationFrame'` | 定时器类型,不支持动态修改 | 当前默认值是`setTimeout`,后期会改为`requestAnimationFrame` |
|
|
444
|
+
| `theme` | `'light'` \| `'dark'` | 主题类型 | `'light'` |
|
|
445
|
+
| `customConvertMarkdownString` | `(markdownString: string) => string` | 自定义 markdown 字符串转换函数 | - |
|
|
446
|
+
| `onEnd` | `(data: EndData) => void` | 打字结束回调 | - |
|
|
447
|
+
| `onStart` | `(data: StartData) => void` | 打字开始回调 | - |
|
|
448
|
+
| `onBeforeTypedChar` | `(data: IBeforeTypedChar) => Promise<void>` | 字符打字前的回调,支持异步操作,会阻塞之后的打字 | - |
|
|
449
|
+
| `onTypedChar` | `(data: ITypedChar) => void` | 每字符打字后的回调 | - |
|
|
450
|
+
| `disableTyping` | `boolean` | 禁用打字动画效果 | `false` |
|
|
451
|
+
| `autoStartTyping` | `boolean` | 是否自动开始打字动画,设为 false 时需手动触发,不支持动态修改 | `true` |
|
|
447
452
|
|
|
448
453
|
> 注意: 如果当在打字中 `disableTyping`从 `true` 变为 `false`,则在下一个打字触发时,会把剩下的所有字一次性显示
|
|
449
454
|
|
|
@@ -466,16 +471,23 @@ import MarkdownTyper, { MarkdownCMD } from 'react-markdown-typer';
|
|
|
466
471
|
| `currentStr` | `string` | 当前类型内容的完整字符串 | - |
|
|
467
472
|
| `percent` | `number` | 打字进度百分比 (0-100) | `0` |
|
|
468
473
|
|
|
469
|
-
####
|
|
474
|
+
#### 自定义 Markdown 转换
|
|
470
475
|
|
|
471
|
-
|
|
472
|
-
| ------------- | ------------------------- | ------------------ | ---------- |
|
|
473
|
-
| `splitSymbol` | `'dollar'` \| `'bracket'` | 数学公式分隔符类型 | `'dollar'` |
|
|
476
|
+
`customConvertMarkdownString` 函数允许您在渲染前预处理 markdown 内容。这适用于:
|
|
474
477
|
|
|
475
|
-
|
|
478
|
+
- 自定义 markdown 语法扩展
|
|
479
|
+
- 内容过滤或清理
|
|
480
|
+
- 与外部 markdown 处理器集成
|
|
481
|
+
- 自定义链接处理或格式化
|
|
476
482
|
|
|
477
|
-
|
|
478
|
-
|
|
483
|
+
**示例:**
|
|
484
|
+
|
|
485
|
+
```tsx
|
|
486
|
+
const customConvertMarkdownString = (markdownString) => {
|
|
487
|
+
// 在这里添加自定义处理逻辑
|
|
488
|
+
return markdownString.replace(/\[([^\]]+)\]\(([^)]+)\)/g, '<a href="$2" target="_blank">$1</a>').replace(/\*\*([^*]+)\*\*/g, '<strong>$1</strong>');
|
|
489
|
+
};
|
|
490
|
+
```
|
|
479
491
|
|
|
480
492
|
#### IMarkdownPlugin
|
|
481
493
|
|
|
@@ -515,90 +527,77 @@ markdownRef.current?.restart(); // 重新开始动画
|
|
|
515
527
|
|
|
516
528
|
---
|
|
517
529
|
|
|
518
|
-
##
|
|
519
|
-
|
|
520
|
-
<!-- [DEMO1:勾股定理](https://stackblitz.com/edit/vitejs-vite-z94syu8j?file=src%2FApp.tsx) -->
|
|
530
|
+
## 🔧 自定义 Markdown 处理指南
|
|
521
531
|
|
|
522
|
-
|
|
523
|
-
|
|
524
|
-
### 基本语法
|
|
532
|
+
### 基本用法
|
|
525
533
|
|
|
526
534
|
```tsx
|
|
527
|
-
import
|
|
528
|
-
import rehypeKatex from 'rehype-katex';
|
|
529
|
-
|
|
530
|
-
// 1. 启用数学公式支持
|
|
531
|
-
<MarkdownTyper reactMarkdownProps={{ remarkPlugins: [remarkMath], rehypePlugins: [rehypeKatex]}}>
|
|
532
|
-
# 数学公式示例
|
|
535
|
+
import MarkdownTyper from 'react-markdown-typer';
|
|
533
536
|
|
|
534
|
-
|
|
535
|
-
|
|
537
|
+
function CustomMarkdownDemo() {
|
|
538
|
+
const customConvertMarkdownString = (markdownString) => {
|
|
539
|
+
// 在这里添加您的自定义处理逻辑
|
|
540
|
+
return markdownString
|
|
541
|
+
.replace(/\[([^\]]+)\]\(([^)]+)\)/g, '<a href="$2" target="_blank">$1</a>')
|
|
542
|
+
.replace(/\*\*([^*]+)\*\*/g, '<strong>$1</strong>')
|
|
543
|
+
.replace(/\*([^*]+)\*/g, '<em>$1</em>');
|
|
544
|
+
};
|
|
536
545
|
|
|
537
|
-
|
|
538
|
-
|
|
539
|
-
|
|
546
|
+
return (
|
|
547
|
+
<MarkdownTyper interval={20} customConvertMarkdownString={customConvertMarkdownString}>
|
|
548
|
+
# 自定义 Markdown 处理 这是**粗体文字**和*斜体文字*。查看[我们的网站](https://example.com)了解更多信息!
|
|
549
|
+
</MarkdownTyper>
|
|
550
|
+
);
|
|
551
|
+
}
|
|
540
552
|
```
|
|
541
553
|
|
|
542
|
-
###
|
|
554
|
+
### 高级处理
|
|
543
555
|
|
|
544
|
-
|
|
545
|
-
//
|
|
546
|
-
|
|
547
|
-
|
|
548
|
-
|
|
549
|
-
|
|
550
|
-
|
|
551
|
-
|
|
552
|
-
</
|
|
553
|
-
|
|
554
|
-
|
|
555
|
-
|
|
556
|
-
|
|
557
|
-
|
|
558
|
-
|
|
559
|
-
|
|
560
|
-
|
|
561
|
-
|
|
562
|
-
|
|
556
|
+
````tsx
|
|
557
|
+
// 复杂的自定义处理示例
|
|
558
|
+
const customConvertMarkdownString = (markdownString) => {
|
|
559
|
+
return (
|
|
560
|
+
markdownString
|
|
561
|
+
// 自定义表情符号处理
|
|
562
|
+
.replace(/:([a-zA-Z0-9_]+):/g, '<span class="emoji">:$1:</span>')
|
|
563
|
+
// 自定义提及处理
|
|
564
|
+
.replace(/@([a-zA-Z0-9_]+)/g, '<span class="mention">@$1</span>')
|
|
565
|
+
// 自定义代码块处理
|
|
566
|
+
.replace(/```(\w+)\n([\s\S]*?)```/g, '<pre class="code-block"><code class="language-$1">$2</code></pre>')
|
|
567
|
+
// 自定义链接处理(带安全性)
|
|
568
|
+
.replace(/\[([^\]]+)\]\(([^)]+)\)/g, (match, text, url) => {
|
|
569
|
+
if (url.startsWith('http')) {
|
|
570
|
+
return `<a href="${url}" target="_blank" rel="noopener noreferrer">${text}</a>`;
|
|
571
|
+
}
|
|
572
|
+
return match;
|
|
573
|
+
})
|
|
574
|
+
);
|
|
575
|
+
};
|
|
576
|
+
````
|
|
563
577
|
|
|
564
|
-
###
|
|
578
|
+
### 与外部处理器集成
|
|
565
579
|
|
|
566
580
|
```tsx
|
|
567
|
-
|
|
568
|
-
|
|
569
|
-
|
|
570
|
-
|
|
571
|
-
|
|
572
|
-
|
|
573
|
-
|
|
574
|
-
|
|
575
|
-
|
|
576
|
-
'$c = \\sqrt{3^2 + 4^2} = \\sqrt{25} = 5$\n\n',
|
|
577
|
-
'这个定理在几何学中有着广泛的应用!',
|
|
578
|
-
];
|
|
579
|
-
|
|
580
|
-
mathContent.forEach((chunk) => {
|
|
581
|
-
markdownRef.current?.push(chunk, 'answer');
|
|
582
|
-
});
|
|
581
|
+
import { marked } from 'marked';
|
|
582
|
+
|
|
583
|
+
const customConvertMarkdownString = (markdownString) => {
|
|
584
|
+
// 使用 marked.js 进行处理
|
|
585
|
+
return marked(markdownString, {
|
|
586
|
+
breaks: true,
|
|
587
|
+
gfm: true,
|
|
588
|
+
});
|
|
589
|
+
};
|
|
583
590
|
```
|
|
584
591
|
|
|
585
|
-
###
|
|
586
|
-
|
|
587
|
-
```css
|
|
588
|
-
/* 数学公式样式定制 */
|
|
589
|
-
.katex {
|
|
590
|
-
font-size: 1.1em;
|
|
591
|
-
}
|
|
592
|
+
### 内容过滤
|
|
592
593
|
|
|
593
|
-
|
|
594
|
-
|
|
595
|
-
|
|
596
|
-
|
|
594
|
+
```tsx
|
|
595
|
+
const customConvertMarkdownString = (markdownString) => {
|
|
596
|
+
// 过滤敏感内容
|
|
597
|
+
const filteredContent = markdownString.replace(/password[:\s]*[^\s]+/gi, 'password: [已过滤]').replace(/token[:\s]*[^\s]+/gi, 'token: [已过滤]');
|
|
597
598
|
|
|
598
|
-
|
|
599
|
-
|
|
600
|
-
color: #e1e1e1;
|
|
601
|
-
}
|
|
599
|
+
return filteredContent;
|
|
600
|
+
};
|
|
602
601
|
```
|
|
603
602
|
|
|
604
603
|
---
|
|
@@ -720,31 +719,35 @@ function StreamingChat() {
|
|
|
720
719
|
const delay = (ms: number) => new Promise((resolve) => setTimeout(resolve, ms));
|
|
721
720
|
````
|
|
722
721
|
|
|
723
|
-
###
|
|
722
|
+
### 🔧 自定义 Markdown 处理演示
|
|
724
723
|
|
|
725
724
|
```tsx
|
|
726
|
-
|
|
727
|
-
import rehypeKatex from 'rehype-katex';
|
|
728
|
-
|
|
729
|
-
function MathStreamingDemo() {
|
|
725
|
+
function CustomMarkdownStreamingDemo() {
|
|
730
726
|
const markdownRef = useRef<MarkdownCMDRef>(null);
|
|
731
727
|
|
|
732
|
-
const
|
|
728
|
+
const customConvertMarkdownString = (markdownString) => {
|
|
729
|
+
return markdownString
|
|
730
|
+
.replace(/\[([^\]]+)\]\(([^)]+)\)/g, '<a href="$2" target="_blank" rel="noopener noreferrer">$1</a>')
|
|
731
|
+
.replace(/\*\*([^*]+)\*\*/g, '<strong>$1</strong>')
|
|
732
|
+
.replace(/\*([^*]+)\*/g, '<em>$1</em>')
|
|
733
|
+
.replace(/`([^`]+)`/g, '<code>$1</code>');
|
|
734
|
+
};
|
|
735
|
+
|
|
736
|
+
const simulateCustomResponse = async () => {
|
|
733
737
|
markdownRef.current?.clear();
|
|
734
738
|
|
|
735
|
-
const
|
|
736
|
-
'#
|
|
737
|
-
'
|
|
738
|
-
'
|
|
739
|
-
'
|
|
740
|
-
'-
|
|
741
|
-
'-
|
|
742
|
-
'
|
|
743
|
-
'
|
|
744
|
-
'这个定理在几何学中有着广泛的应用!',
|
|
739
|
+
const customChunks = [
|
|
740
|
+
'# 自定义 Markdown 处理\n\n',
|
|
741
|
+
'这个演示展示了如何在流式内容中使用**自定义 markdown 处理**:\n\n',
|
|
742
|
+
'## 功能特性\n',
|
|
743
|
+
'- *自定义链接处理*\n',
|
|
744
|
+
'- **粗体和斜体**文字处理\n',
|
|
745
|
+
'- `行内代码`格式化\n',
|
|
746
|
+
'- [外部链接](https://example.com) 带安全属性\n\n',
|
|
747
|
+
'`customConvertMarkdownString` 函数允许您在渲染前预处理内容!',
|
|
745
748
|
];
|
|
746
749
|
|
|
747
|
-
for (const chunk of
|
|
750
|
+
for (const chunk of customChunks) {
|
|
748
751
|
await delay(150);
|
|
749
752
|
markdownRef.current?.push(chunk, 'answer');
|
|
750
753
|
}
|
|
@@ -752,15 +755,9 @@ function MathStreamingDemo() {
|
|
|
752
755
|
|
|
753
756
|
return (
|
|
754
757
|
<div>
|
|
755
|
-
<button onClick={
|
|
756
|
-
|
|
757
|
-
<MarkdownCMD
|
|
758
|
-
ref={markdownRef}
|
|
759
|
-
interval={20}
|
|
760
|
-
timerType="requestAnimationFrame"
|
|
761
|
-
reactMarkdownProps={{ remarkPlugins: [remarkMath], rehypePlugins: [rehypeKatex] }}
|
|
762
|
-
math={{ splitSymbol: 'dollar' }}
|
|
763
|
-
/>
|
|
758
|
+
<button onClick={simulateCustomResponse}>🔧 自定义 Markdown 演示</button>
|
|
759
|
+
|
|
760
|
+
<MarkdownCMD ref={markdownRef} interval={20} timerType="requestAnimationFrame" customConvertMarkdownString={customConvertMarkdownString} />
|
|
764
761
|
</div>
|
|
765
762
|
);
|
|
766
763
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/Markdown/index.tsx"],"names":[],"mappings":"AAAA,OAAO,KAA4E,MAAM,OAAO,CAAC;AAEjG,OAAO,EAAkB,aAAa,EAAe,MAAM,YAAY,CAAC;;
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/Markdown/index.tsx"],"names":[],"mappings":"AAAA,OAAO,KAA4E,MAAM,OAAO,CAAC;AAEjG,OAAO,EAAkB,aAAa,EAAe,MAAM,YAAY,CAAC;;AAuExE,wBAA8B"}
|
package/es/Markdown/index.js
CHANGED
|
@@ -32,6 +32,9 @@ const MarkdownInner = ({ children: _children = '', markdownRef, ...rest }) => {
|
|
|
32
32
|
cmdRef.current.push(newContent);
|
|
33
33
|
prefixRef.current = content;
|
|
34
34
|
}
|
|
35
|
+
return () => {
|
|
36
|
+
console.log('unmount');
|
|
37
|
+
};
|
|
35
38
|
}, [content]);
|
|
36
39
|
useImperativeHandle(markdownRef, () => ({
|
|
37
40
|
stop: () => {
|
package/es/Markdown/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/Markdown/index.tsx"],"names":[],"mappings":";AAAA,OAAc,EAAE,UAAU,EAAE,IAAI,EAAE,SAAS,EAAE,mBAAmB,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM,OAAO,CAAC;AACjG,OAAO,EAAE,OAAO,EAAE,MAAM,aAAa,CAAC;AAEtC,OAAO,WAAW,MAAM,gBAAgB,CAAC;AAMzC,MAAM,aAAa,GAAiC,CAAC,EAAE,QAAQ,EAAE,SAAS,GAAG,EAAE,EAAE,WAAW,EAAE,GAAG,IAAI,EAAE,EAAE,EAAE;IACzG,MAAM,MAAM,GAAG,MAAM,CAAiB,IAAK,CAAC,CAAC;IAC7C,MAAM,SAAS,GAAG,MAAM,CAAC,EAAE,CAAC,CAAC;IAC7B,MAAM,OAAO,GAAG,OAAO,CAAC,GAAG,EAAE;QAC3B,IAAI,OAAO,SAAS,KAAK,QAAQ,EAAE,CAAC;YAClC,OAAO,SAAS,CAAC;QACnB,CAAC;QACD,IAAI,OAAO,EAAE,CAAC;YACZ,OAAO,CAAC,KAAK,CAAC,6CAA6C,CAAC,CAAC;QAC/D,CAAC;QACD,OAAO,EAAE,CAAC;IACZ,CAAC,EAAE,CAAC,SAAS,CAAC,CAAC,CAAC;IAEhB,SAAS,CAAC,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,CAAC,CAAC;YAChC,SAAS,CAAC,OAAO,GAAG,OAAO,CAAC;QAC9B,CAAC;
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/Markdown/index.tsx"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/MarkdownCMD/index.tsx"],"names":[],"mappings":"AACA,OAAO,EAAE,gBAAgB,EAAwB,cAAc,EAAE,MAAM,YAAY,CAAC;AAMpF,QAAA,MAAM,WAAW,
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/MarkdownCMD/index.tsx"],"names":[],"mappings":"AACA,OAAO,EAAE,gBAAgB,EAAwB,cAAc,EAAE,MAAM,YAAY,CAAC;AAMpF,QAAA,MAAM,WAAW,6GAkLhB,CAAC;AAMF,eAAe,WAAW,CAAC"}
|
package/es/MarkdownCMD/index.js
CHANGED
|
@@ -1,9 +1,10 @@
|
|
|
1
1
|
import { jsx as _jsx } from "react/jsx-runtime";
|
|
2
|
-
import { forwardRef, useImperativeHandle, useRef, useState } from 'react';
|
|
2
|
+
import { forwardRef, useImperativeHandle, useMemo, useRef, useState } from 'react';
|
|
3
3
|
import { __DEV__ } from '../constant.js';
|
|
4
4
|
import { useTypingTask } from '../hooks/useTypingTask.js';
|
|
5
|
-
import
|
|
6
|
-
|
|
5
|
+
import ReactMarkdown from 'react-markdown';
|
|
6
|
+
import { splitGraphemes } from '../utils/grapheme.js';
|
|
7
|
+
const MarkdownCMD = forwardRef(({ interval = 30, onEnd, onStart, onTypedChar, onBeforeTypedChar, timerType = 'setTimeout', reactMarkdownProps, disableTyping = false, autoStartTyping = true, customConvertMarkdownString }, ref) => {
|
|
7
8
|
/** 是否自动开启打字动画, 后面发生变化将不会生效 */
|
|
8
9
|
const autoStartTypingRef = useRef(autoStartTyping);
|
|
9
10
|
/** 是否打过字 */
|
|
@@ -65,7 +66,8 @@ const MarkdownCMD = forwardRef(({ interval = 30, onEnd, onStart, onTypedChar, on
|
|
|
65
66
|
if (content.length === 0) {
|
|
66
67
|
return;
|
|
67
68
|
}
|
|
68
|
-
|
|
69
|
+
const segments = splitGraphemes(content);
|
|
70
|
+
charsRef.current.push(...segments.map((chatStr) => {
|
|
69
71
|
const index = charIndexRef.current++;
|
|
70
72
|
const charObj = {
|
|
71
73
|
content: chatStr,
|
|
@@ -151,7 +153,10 @@ const MarkdownCMD = forwardRef(({ interval = 30, onEnd, onStart, onTypedChar, on
|
|
|
151
153
|
typingTask.restart();
|
|
152
154
|
},
|
|
153
155
|
}));
|
|
154
|
-
|
|
156
|
+
const markdownString = useMemo(() => {
|
|
157
|
+
return (customConvertMarkdownString === null || customConvertMarkdownString === void 0 ? void 0 : customConvertMarkdownString(wholeContentRef.current.content)) || wholeContentRef.current.content;
|
|
158
|
+
}, [wholeContentRef.current.content, customConvertMarkdownString]);
|
|
159
|
+
return _jsx(ReactMarkdown, { ...reactMarkdownProps, children: markdownString });
|
|
155
160
|
});
|
|
156
161
|
if (__DEV__) {
|
|
157
162
|
MarkdownCMD.displayName = 'MarkdownCMD';
|
|
@@ -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;
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/MarkdownCMD/index.tsx"],"names":[],"mappings":"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"}
|
package/es/defined.d.ts
CHANGED
|
@@ -1,4 +1,14 @@
|
|
|
1
1
|
import { Options } from 'react-markdown';
|
|
2
|
+
export type IntervalType = number | {
|
|
3
|
+
/** 最大间隔 */
|
|
4
|
+
max: number;
|
|
5
|
+
/** 最小间隔 */
|
|
6
|
+
min: number;
|
|
7
|
+
/** 曲线函数自定义 */
|
|
8
|
+
curveFn?: (x: number) => number;
|
|
9
|
+
/** 曲线函数,如果配置了curveFn,则curve无效 */
|
|
10
|
+
curve?: 'ease' | 'ease-in' | 'ease-out' | 'ease-in-out' | 'linear' | 'step-start' | 'step-end';
|
|
11
|
+
};
|
|
2
12
|
/**
|
|
3
13
|
* 字符接口
|
|
4
14
|
*/
|
|
@@ -40,7 +50,7 @@ export interface MarkdownBaseProps {
|
|
|
40
50
|
/** 计时类型: 支持setTimeout和requestAnimationFrame */
|
|
41
51
|
timerType?: 'setTimeout' | 'requestAnimationFrame';
|
|
42
52
|
/** 打字机效果间隔时间 */
|
|
43
|
-
interval:
|
|
53
|
+
interval: IntervalType;
|
|
44
54
|
/** 是否关闭打字机效果 */
|
|
45
55
|
disableTyping?: boolean;
|
|
46
56
|
/** 打字完成后回调, */
|
|
@@ -57,7 +67,8 @@ export interface MarkdownBaseProps {
|
|
|
57
67
|
onTypedChar?: (data?: ITypedChar) => void;
|
|
58
68
|
/** 是否自动开启打字动画 */
|
|
59
69
|
autoStartTyping?: boolean;
|
|
60
|
-
|
|
70
|
+
/** 自定义转换markdown string 函数 */
|
|
71
|
+
customConvertMarkdownString?: (markdownString: string) => string;
|
|
61
72
|
}
|
|
62
73
|
export interface MarkdownProps extends MarkdownBaseProps {
|
|
63
74
|
children: string | undefined;
|
package/es/defined.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"defined.d.ts","sourceRoot":"","sources":["../src/defined.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,gBAAgB,CAAC;AAEzC;;GAEG;AACH,MAAM,WAAW,KAAK;IACpB,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,EAAE,MAAM,CAAC;IAChB,WAAW;IACX,KAAK,EAAE,MAAM,CAAC;CACf;AAED;;;;GAIG;AACH,MAAM,WAAW,UAAU;IACzB,WAAW;IACX,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,YAAY;IACZ,OAAO,EAAE,OAAO,CAAC;CAClB;AAED,MAAM,WAAW,gBAAgB;IAC/B,UAAU,EAAE,MAAM,CAAC;IACnB,GAAG,EAAE,MAAM,CAAC;CACb;AAED,MAAM,WAAW,gBAAgB;IAC/B,YAAY,EAAE,MAAM,CAAC;IACrB,WAAW,EAAE,MAAM,CAAC;IACpB,OAAO,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,WAAW,UAAW,SAAQ,gBAAgB;IAClD,OAAO,EAAE,MAAM,CAAC;IAChB,UAAU,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,WAAW,gBAAiB,SAAQ,gBAAgB;IACxD,OAAO,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,WAAW,iBAAiB;IAChC,kBAAkB,CAAC,EAAE,OAAO,CAAC;IAC7B,+CAA+C;IAC/C,SAAS,CAAC,EAAE,YAAY,GAAG,uBAAuB,CAAC;IACnD,gBAAgB;IAChB,QAAQ,EAAE,
|
|
1
|
+
{"version":3,"file":"defined.d.ts","sourceRoot":"","sources":["../src/defined.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
|
-
import { IChar, ITypedChar, IWholeContent, MarkdownProps, IEndData, IBeforeTypedChar } from '../defined';
|
|
1
|
+
import { IChar, ITypedChar, IWholeContent, MarkdownProps, IEndData, IBeforeTypedChar, IntervalType } from '../defined';
|
|
2
2
|
interface UseTypingTaskOptions {
|
|
3
3
|
timerType: MarkdownProps['timerType'];
|
|
4
|
-
interval:
|
|
4
|
+
interval: IntervalType;
|
|
5
5
|
charsRef: React.RefObject<IChar[]>;
|
|
6
6
|
onEnd?: (data?: IEndData) => void;
|
|
7
7
|
onStart?: (data?: {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"useTypingTask.d.ts","sourceRoot":"","sources":["../../src/hooks/useTypingTask.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,KAAK,EAAE,UAAU,EAAE,aAAa,EAAE,aAAa,EAAE,QAAQ,EAAE,gBAAgB,EAAE,MAAM,YAAY,CAAC;
|
|
1
|
+
{"version":3,"file":"useTypingTask.d.ts","sourceRoot":"","sources":["../../src/hooks/useTypingTask.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,KAAK,EAAE,UAAU,EAAE,aAAa,EAAE,aAAa,EAAE,QAAQ,EAAE,gBAAgB,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAEvH,UAAU,oBAAoB;IAC5B,SAAS,EAAE,aAAa,CAAC,WAAW,CAAC,CAAC;IACtC,QAAQ,EAAE,YAAY,CAAC;IACvB,QAAQ,EAAE,KAAK,CAAC,SAAS,CAAC,KAAK,EAAE,CAAC,CAAC;IACnC,KAAK,CAAC,EAAE,CAAC,IAAI,CAAC,EAAE,QAAQ,KAAK,IAAI,CAAC;IAClC,OAAO,CAAC,EAAE,CAAC,IAAI,CAAC,EAAE;QAAE,YAAY,EAAE,MAAM,CAAC;QAAC,WAAW,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,CAAA;KAAE,KAAK,IAAI,CAAC;IAC1F,iBAAiB,CAAC,EAAE,CAAC,IAAI,CAAC,EAAE,gBAAgB,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;IAC/D,WAAW,CAAC,EAAE,CAAC,IAAI,CAAC,EAAE,UAAU,KAAK,IAAI,CAAC;IAC1C,kBAAkB,EAAE,CAAC,IAAI,EAAE,KAAK,KAAK,IAAI,CAAC;IAC1C,eAAe,EAAE,KAAK,CAAC,SAAS,CAAC,aAAa,CAAC,CAAC;IAChD,aAAa,EAAE,OAAO,CAAC;IACvB,aAAa,EAAE,MAAM,IAAI,CAAC;IAC1B,iBAAiB,EAAE,MAAM,IAAI,CAAC;CAC/B;AAED,MAAM,WAAW,oBAAoB;IACnC,KAAK,EAAE,MAAM,IAAI,CAAC;IAClB,IAAI,EAAE,MAAM,IAAI,CAAC;IACjB,KAAK,EAAE,MAAM,IAAI,CAAC;IAClB,QAAQ,EAAE,MAAM,OAAO,CAAC;IACxB,qBAAqB;IACrB,oBAAoB,EAAE,KAAK,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC;IAC/C,MAAM,EAAE,MAAM,IAAI,CAAC;IACnB,OAAO,EAAE,MAAM,IAAI,CAAC;CACrB;AAED,eAAO,MAAM,aAAa,GAAI,SAAS,oBAAoB,KAAG,oBAsa7D,CAAC"}
|
|
@@ -17,6 +17,54 @@ export const useTypingTask = (options) => {
|
|
|
17
17
|
disableTypingRef.current = disableTyping;
|
|
18
18
|
const intervalRef = useRef(interval);
|
|
19
19
|
intervalRef.current = interval;
|
|
20
|
+
// 记录本次打字任务的初始/最高剩余字符总量,用于计算剩余占比(流式追加时会增大)
|
|
21
|
+
const initialRemainTotalRef = useRef(0);
|
|
22
|
+
/**
|
|
23
|
+
* 根据剩余字符数与曲线配置,计算当前打字间隔(毫秒)
|
|
24
|
+
*/
|
|
25
|
+
const getCurrentInterval = (remainCharsLength) => {
|
|
26
|
+
const cfg = intervalRef.current;
|
|
27
|
+
if (typeof cfg === 'number')
|
|
28
|
+
return cfg;
|
|
29
|
+
// 动态更新初始参考总量,考虑流式场景新增字符
|
|
30
|
+
if (remainCharsLength > initialRemainTotalRef.current) {
|
|
31
|
+
initialRemainTotalRef.current = remainCharsLength;
|
|
32
|
+
}
|
|
33
|
+
const baseTotal = initialRemainTotalRef.current || remainCharsLength || 1;
|
|
34
|
+
// r: 剩余占比 [0,1],越大表示剩余越多
|
|
35
|
+
const r = Math.max(0, Math.min(1, remainCharsLength / baseTotal));
|
|
36
|
+
// 曲线函数(优先使用自定义)
|
|
37
|
+
const pickCurveFn = () => {
|
|
38
|
+
if (typeof cfg.curveFn === 'function')
|
|
39
|
+
return cfg.curveFn;
|
|
40
|
+
switch (cfg.curve) {
|
|
41
|
+
case 'linear':
|
|
42
|
+
return (x) => x;
|
|
43
|
+
case 'ease-in':
|
|
44
|
+
return (x) => x * x; // 加速慢起
|
|
45
|
+
case 'ease-out':
|
|
46
|
+
return (x) => 1 - (1 - x) * (1 - x); // 减速快止
|
|
47
|
+
case 'ease-in-out':
|
|
48
|
+
return (x) => (x < 0.5 ? 2 * x * x : 1 - Math.pow(-2 * x + 2, 2) / 2);
|
|
49
|
+
case 'step-start':
|
|
50
|
+
return (x) => (x > 0 ? 1 : 0);
|
|
51
|
+
case 'step-end':
|
|
52
|
+
return (x) => (x < 1 ? 0 : 1);
|
|
53
|
+
case 'ease':
|
|
54
|
+
default:
|
|
55
|
+
// 近似通用 ease
|
|
56
|
+
return (x) => 1 - Math.pow(1 - x, 1.6);
|
|
57
|
+
}
|
|
58
|
+
};
|
|
59
|
+
const curveFn = pickCurveFn();
|
|
60
|
+
const y = curveFn(r); // y ∈ [0,1],随 r 增大而增大
|
|
61
|
+
// 设计:剩余越多 => 越快(更小的间隔)。
|
|
62
|
+
// interval = min + (max - min) * (1 - y)
|
|
63
|
+
const min = Math.max(0, cfg.min);
|
|
64
|
+
const max = Math.max(min, cfg.max);
|
|
65
|
+
const intervalMs = min + (max - min) * (1 - y);
|
|
66
|
+
return intervalMs;
|
|
67
|
+
};
|
|
20
68
|
const getChars = () => {
|
|
21
69
|
return charsRef.current;
|
|
22
70
|
};
|
|
@@ -24,7 +72,6 @@ export const useTypingTask = (options) => {
|
|
|
24
72
|
isUnmountRef.current = false;
|
|
25
73
|
return () => {
|
|
26
74
|
isUnmountRef.current = true;
|
|
27
|
-
clearTimer();
|
|
28
75
|
};
|
|
29
76
|
}, []);
|
|
30
77
|
/**
|
|
@@ -145,20 +192,21 @@ export const useTypingTask = (options) => {
|
|
|
145
192
|
const startAnimationFrameMode = () => {
|
|
146
193
|
let lastFrameTime = performance.now();
|
|
147
194
|
const frameLoop = async (currentTime) => {
|
|
195
|
+
if (isUnmountRef.current)
|
|
196
|
+
return;
|
|
148
197
|
// 如果关闭打字机效果,则打完所有字符
|
|
149
198
|
if (disableTypingRef.current) {
|
|
150
199
|
await typingRemainAll();
|
|
151
200
|
return;
|
|
152
201
|
}
|
|
153
202
|
const chars = getChars();
|
|
154
|
-
if (isUnmountRef.current)
|
|
155
|
-
return;
|
|
156
203
|
if (chars.length === 0) {
|
|
157
204
|
stopAnimationFrame();
|
|
158
205
|
return;
|
|
159
206
|
}
|
|
160
207
|
const deltaTime = currentTime - lastFrameTime;
|
|
161
|
-
|
|
208
|
+
const currentInterval = getCurrentInterval(chars.length);
|
|
209
|
+
let needToTypingCharsLength = Math.max(0, Math.floor(deltaTime / currentInterval));
|
|
162
210
|
needToTypingCharsLength = Math.min(needToTypingCharsLength, chars.length);
|
|
163
211
|
if (needToTypingCharsLength > 0) {
|
|
164
212
|
// 处理字符
|
|
@@ -212,17 +260,18 @@ export const useTypingTask = (options) => {
|
|
|
212
260
|
stopTimeout();
|
|
213
261
|
return;
|
|
214
262
|
}
|
|
215
|
-
|
|
263
|
+
const currentInterval = getCurrentInterval(chars.length);
|
|
264
|
+
timerRef.current = setTimeout(startTyped, currentInterval);
|
|
216
265
|
};
|
|
217
266
|
const startTyped = async (isStartPoint = false) => {
|
|
267
|
+
if (isUnmountRef.current)
|
|
268
|
+
return;
|
|
218
269
|
// 如果关闭打字机效果,则打完所有字符
|
|
219
270
|
if (disableTypingRef.current) {
|
|
220
271
|
typingRemainAll();
|
|
221
272
|
return;
|
|
222
273
|
}
|
|
223
274
|
const chars = getChars();
|
|
224
|
-
if (isUnmountRef.current)
|
|
225
|
-
return;
|
|
226
275
|
isTypingRef.current = true;
|
|
227
276
|
const char = chars.shift();
|
|
228
277
|
if (char === undefined) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"useTypingTask.js","sourceRoot":"","sources":["../../src/hooks/useTypingTask.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"useTypingTask.js","sourceRoot":"","sources":["../../src/hooks/useTypingTask.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"grapheme.d.ts","sourceRoot":"","sources":["../../src/utils/grapheme.ts"],"names":[],"mappings":"AAAA,wBAAgB,cAAc,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,EAAE,CAEtD"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"grapheme.js","sourceRoot":"","sources":["../../src/utils/grapheme.ts"],"names":[],"mappings":"AAAA,MAAM,UAAU,cAAc,CAAC,KAAa;IAC1C,OAAO,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;AAC3B,CAAC"}
|