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 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
- - [Math Formula Support](#math-formula-support)
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
- - [IMarkdownMath](#imarkdownmath)
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
- - [🧮 Math Formula Guide](#-math-formula-guide)
77
- - [Basic Syntax](#basic-syntax)
78
- - [Delimiter Selection](#delimiter-selection)
79
- - [Streaming Math Formulas](#streaming-math-formulas)
80
- - [Style Customization](#style-customization)
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
- - [🧮 Streaming Math Formula Rendering](#-streaming-math-formula-rendering)
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
- ### Math Formula Support
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 MathDemo() {
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} reactMarkdownProps={{ remarkPlugins: [remarkMath], rehypePlugins: [rehypeKatex] }} math={{ splitSymbol: 'dollar' }}>
200
- # Pythagorean Theorem In a right triangle, the square of the hypotenuse equals the sum of the squares of the other two sides: $a^2 + b^2 = c^2$ Where: - $a$ and $b$ are the legs - $c$ is the
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 | Type | Description | Default |
468
- | ------------------- | ------------------------------------------- | ------------------------------------------------------------------------------------------------- | ----------------------------------------------------------------------------- |
469
- | `interval` | `number` | Typing interval (ms) | `30` |
470
- | `timerType` | `'setTimeout'` \| `'requestAnimationFrame'` | Timer type, not dynamically changeable | Default is `setTimeout`, will switch to `requestAnimationFrame` in the future |
471
- | `theme` | `'light'` \| `'dark'` | Theme type | `'light'` |
472
- | `math` | [IMarkdownMath](#IMarkdownMath) | Math formula config | `{ splitSymbol: 'dollar' }` |
473
- | `onEnd` | `(data: EndData) => void` | Typing end callback | - |
474
- | `onStart` | `(data: StartData) => void` | Typing start callback | - |
475
- | `onBeforeTypedChar` | `(data: IBeforeTypedChar) => Promise<void>` | Callback before typing a character, supports async, blocks next typing | - |
476
- | `onTypedChar` | `(data: ITypedChar) => void` | Callback after each character | - |
477
- | `disableTyping` | `boolean` | Disable typing animation | `false` |
478
- | `autoStartTyping` | `boolean` | Whether to auto start typing animation, set false to trigger manually, not dynamically changeable | `true` |
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
- #### IMarkdownMath
505
+ #### Custom Markdown Conversion
502
506
 
503
- | Prop | Type | Description | Default |
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
- **Delimiter Explanation:**
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
- - `'dollar'`: Use `$...$` and `$$...$$` syntax
510
- - `'bracket'`: Use `\(...\)` and `\[...\]` syntax
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
- ## 🧮 Math Formula Guide
551
-
552
- <!-- [DEMO1: Pythagorean Theorem](https://stackblitz.com/edit/vitejs-vite-z94syu8j?file=src%2FApp.tsx) -->
561
+ ## 🔧 Custom Markdown Processing Guide
553
562
 
554
- <!-- [DEMO2: Problem Solution](https://stackblitz.com/edit/vitejs-vite-xk9lxagc?file=README.md) -->
555
-
556
- ### Basic Syntax
563
+ ### Basic Usage
557
564
 
558
565
  ```tsx
559
- import remarkMath from 'remark-math';
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
- // Inline formula
567
- This is an inline formula: $E = mc^2$
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
- // Block formula
570
- $$\int_{-\infty}^{\infty} e^{-x^2} dx = \sqrt{\pi}$$
571
- </MarkdownTyper>
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
- ### Delimiter Selection
585
+ ### Advanced Processing
575
586
 
576
- ```tsx
577
- // Use dollar sign delimiter (default)
578
- <MarkdownTyper
579
- reactMarkdownProps={{ remarkPlugins: [remarkMath], rehypePlugins: [rehypeKatex]}}
580
- math={{ splitSymbol: 'dollar' }}
581
- >
582
- Inline: $a + b = c$
583
- Block: $$\sum_{i=1}^{n} x_i = x_1 + x_2 + \cdots + x_n$$
584
- </MarkdownTyper>
585
-
586
- // Use bracket delimiter
587
- <MarkdownTyper
588
- reactMarkdownProps={{ remarkPlugins: [remarkMath], rehypePlugins: [rehypeKatex]}}
589
- math={{ splitSymbol: 'bracket' }}
590
- >
591
- Inline: \(a + b = c\)
592
- Block: \[\sum_{i=1}^{n} x_i = x_1 + x_2 + \cdots + x_n\]
593
- </MarkdownTyper>
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
- ### Streaming Math Formulas
609
+ ### Integration with External Processors
597
610
 
598
611
  ```tsx
599
- // Perfectly supports streaming output of math formulas
600
- const mathContent = [
601
- 'Pythagorean theorem:',
602
- '$a^2 + b^2 = c^2$',
603
- '\n\n',
604
- 'Where:',
605
- '- $a$ and $b$ are the legs\n',
606
- '- $c$ is the hypotenuse\n\n',
607
- 'For the classic "3-4-5 triangle":\n',
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
- ### Style Customization
618
-
619
- ```css
620
- /* Math formula style customization */
621
- .katex {
622
- font-size: 1.1em;
623
- }
623
+ ### Content Filtering
624
624
 
625
- .katex-display {
626
- margin: 1em 0;
627
- text-align: center;
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
- /* Dark theme adaptation */
631
- [data-theme='dark'] .katex {
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
- ### 🧮 Streaming Math Formula Rendering
753
+ ### 🔧 Custom Markdown Processing Demo
756
754
 
757
755
  ```tsx
758
- import remarkMath from 'remark-math';
759
- import rehypeKatex from 'rehype-katex';
760
-
761
- function MathStreamingDemo() {
756
+ function CustomMarkdownStreamingDemo() {
762
757
  const markdownRef = useRef<MarkdownCMDRef>(null);
763
758
 
764
- const simulateMathResponse = async () => {
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 mathChunks = [
768
- '# Pythagorean Theorem Explained\n\n',
769
- 'In a right triangle, the square of the hypotenuse equals the sum of the squares of the other two sides:\n\n',
770
- '$a^2 + b^2 = c^2$\n\n',
771
- 'Where:\n',
772
- '- $a$ and $b$ are the legs\n',
773
- '- $c$ is the hypotenuse\n\n',
774
- 'For the classic "3-4-5 triangle":\n',
775
- '$c = \\sqrt{3^2 + 4^2} = \\sqrt{25} = 5$\n\n',
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 mathChunks) {
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={simulateMathResponse}>📐 Explain Pythagorean Theorem</button>
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 MathDemo() {
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} reactMarkdownProps={{ remarkPlugins: [remarkMath], rehypePlugins: [rehypeKatex] }} math={{ splitSymbol: 'dollar' }}>
169
- # 勾股定理 在直角三角形中,斜边的平方等于两条直角边的平方和: $a^2 + b^2 = c^2$ 其中: - $a$ 和 $b$ 是直角边 - $c$ 是斜边 对于经典的"勾三股四弦五": $c = \sqrt{3 ^ (2 + 4) ^ 2} = \sqrt{25} = 5$
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` | `number` | 打字间隔 (毫秒) | `30` |
438
- | `timerType` | `'setTimeout'` \| `'requestAnimationFrame'` | 定时器类型,不支持动态修改 | 当前默认值是`setTimeout`,后期会改为`requestAnimationFrame` |
439
- | `theme` | `'light'` \| `'dark'` | 主题类型 | `'light'` |
440
- | `math` | [IMarkdownMath](#IMarkdownMath) | 数学公式配置 | `{ splitSymbol: 'dollar' }` |
441
- | `onEnd` | `(data: EndData) => void` | 打字结束回调 | - |
442
- | `onStart` | `(data: StartData) => void` | 打字开始回调 | - |
443
- | `onBeforeTypedChar` | `(data: IBeforeTypedChar) => Promise<void>` | 字符打字前的回调,支持异步操作,会阻塞之后的打字 | - |
444
- | `onTypedChar` | `(data: ITypedChar) => void` | 每字符打字后的回调 | - |
445
- | `disableTyping` | `boolean` | 禁用打字动画效果 | `false` |
446
- | `autoStartTyping` | `boolean` | 是否自动开始打字动画,设为 false 时需手动触发,不支持动态修改 | `true` |
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
- #### IMarkdownMath
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
- - `'dollar'`:使用 `$...$` 和 `$$...$$` 语法
478
- - `'bracket'`:使用 `\(...\)` 和 `\[...\]` 语法
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
- <!-- [DEMO2:题目解答](https://stackblitz.com/edit/vitejs-vite-xk9lxagc?file=README.md) -->
523
-
524
- ### 基本语法
532
+ ### 基本用法
525
533
 
526
534
  ```tsx
527
- import remarkMath from 'remark-math';
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
- 这是一个行内公式:$E = mc^2$
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
- $$\int_{-\infty}^{\infty} e^{-x^2} dx = \sqrt{\pi}$$
539
- </MarkdownTyper>
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
- ```tsx
545
- // 使用美元符号分隔符(默认)
546
- <MarkdownTyper
547
- reactMarkdownProps={{ remarkPlugins: [remarkMath], rehypePlugins: [rehypeKatex]}}
548
- math={{ splitSymbol: 'dollar' }}
549
- >
550
- 行内:$a + b = c$
551
- 块级:$$\sum_{i=1}^{n} x_i = x_1 + x_2 + \cdots + x_n$$
552
- </MarkdownTyper>
553
-
554
- // 使用括号分隔符
555
- <MarkdownTyper
556
- reactMarkdownProps={{ remarkPlugins: [remarkMath], rehypePlugins: [rehypeKatex]}}
557
- math={{ splitSymbol: 'bracket' }}
558
- >
559
- 行内:\(a + b = c\)
560
- 块级:\[\sum_{i=1}^{n} x_i = x_1 + x_2 + \cdots + x_n\]
561
- </MarkdownTyper>
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
- const mathContent = [
569
- '勾股定理:',
570
- '$a^2 + b^2 = c^2$',
571
- '\n\n',
572
- '其中:',
573
- '- $a$ 和 $b$ 是直角边\n',
574
- '- $c$ 是斜边\n\n',
575
- '对于经典的"勾三股四弦五":\n',
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
- .katex-display {
594
- margin: 1em 0;
595
- text-align: center;
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
- [data-theme='dark'] .katex {
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
- import remarkMath from 'remark-math';
727
- import rehypeKatex from 'rehype-katex';
728
-
729
- function MathStreamingDemo() {
725
+ function CustomMarkdownStreamingDemo() {
730
726
  const markdownRef = useRef<MarkdownCMDRef>(null);
731
727
 
732
- const simulateMathResponse = async () => {
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 mathChunks = [
736
- '# 勾股定理详解\n\n',
737
- '在直角三角形中,斜边的平方等于两条直角边的平方和:\n\n',
738
- '$a^2 + b^2 = c^2$\n\n',
739
- '其中:\n',
740
- '- $a$ 和 $b$ 是直角边\n',
741
- '- $c$ 是斜边\n\n',
742
- '对于经典的"勾三股四弦五":\n',
743
- '$c = \\sqrt{3^2 + 4^2} = \\sqrt{25} = 5$\n\n',
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 mathChunks) {
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={simulateMathResponse}>📐 讲解勾股定理</button>
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;;AAoExE,wBAA8B"}
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"}
@@ -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: () => {
@@ -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;IACH,CAAC,EAAE,CAAC,OAAO,CAAC,CAAC,CAAC;IAEd,mBAAmB,CAAC,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;QACD,KAAK,EAAE,GAAG,EAAE;YACV,MAAM,CAAC,OAAO,CAAC,KAAK,EAAE,CAAC;QACzB,CAAC;QACD,OAAO,EAAE,GAAG,EAAE;YACZ,MAAM,CAAC,OAAO,CAAC,OAAO,EAAE,CAAC;QAC3B,CAAC;KACF,CAAC,CAAC,CAAC;IAEJ,OAAO,KAAC,WAAW,IAAC,GAAG,EAAE,MAAM,KAAM,IAAI,GAAI,CAAC;AAChD,CAAC,CAAC;AAEF,MAAM,QAAQ,GAAG,UAAU,CAA6B,CAAC,KAAK,EAAE,GAAG,EAAE,EAAE;IACrE,MAAM,EAAE,QAAQ,GAAG,EAAE,EAAE,GAAG,KAAK,CAAC;IAEhC,IAAI,OAAO,EAAE,CAAC;QACZ,IAAI,OAAO,QAAQ,KAAK,QAAQ,EAAE,CAAC;YACjC,MAAM,IAAI,KAAK,CAAC,6CAA6C,CAAC,CAAC;QACjE,CAAC;IACH,CAAC;IAED,OAAO,KAAC,aAAa,OAAK,KAAK,EAAE,WAAW,EAAE,GAAG,GAAI,CAAC;AACxD,CAAC,CAAC,CAAC;AAEH,eAAe,IAAI,CAAC,QAAQ,CAAC,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,6GA2KhB,CAAC;AAMF,eAAe,WAAW,CAAC"}
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"}
@@ -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 HighReactMarkdown from '../components/HighReactMarkdown/index.js';
6
- const MarkdownCMD = forwardRef(({ interval = 30, onEnd, onStart, onTypedChar, onBeforeTypedChar, timerType = 'setTimeout', math, reactMarkdownProps, disableTyping = false, autoStartTyping = true }, ref) => {
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
- charsRef.current.push(...content.split('').map((chatStr) => {
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
- return _jsx(HighReactMarkdown, { reactMarkdownProps: reactMarkdownProps, children: wholeContentRef.current.content });
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":"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"}
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: number;
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
- math?: IMarkdownMath;
70
+ /** 自定义转换markdown string 函数 */
71
+ customConvertMarkdownString?: (markdownString: string) => string;
61
72
  }
62
73
  export interface MarkdownProps extends MarkdownBaseProps {
63
74
  children: string | undefined;
@@ -1 +1 @@
1
- {"version":3,"file":"defined.d.ts","sourceRoot":"","sources":["../src/defined.ts"],"names":[],"mappings":"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"}
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: number;
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;AAEzG,UAAU,oBAAoB;IAC5B,SAAS,EAAE,aAAa,CAAC,WAAW,CAAC,CAAC;IACtC,QAAQ,EAAE,MAAM,CAAC;IACjB,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,oBAmX7D,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
- let needToTypingCharsLength = Math.max(0, Math.floor(deltaTime / intervalRef.current));
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
- timerRef.current = setTimeout(startTyped, intervalRef.current);
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,2 @@
1
+ export declare function splitGraphemes(input: string): string[];
2
+ //# sourceMappingURL=grapheme.d.ts.map
@@ -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,4 @@
1
+ export function splitGraphemes(input) {
2
+ return Array.from(input);
3
+ }
4
+ //# sourceMappingURL=grapheme.js.map
@@ -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"}
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "react-markdown-typer",
3
3
  "private": false,
4
- "version": "1.0.0-beta.1",
4
+ "version": "1.0.0-beta.3",
5
5
  "main": "./es/index.js",
6
6
  "types": "./es/index.d.ts",
7
7
  "type": "module",