ds-markdown 0.0.14 → 0.0.15-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 +232 -80
- package/README.ja.md +247 -103
- package/README.ko.md +7 -0
- package/README.md +190 -30
- package/dist/cjs/MarkdownCMD/index.js +2 -2
- package/dist/cjs/MarkdownCMD/index.js.map +1 -1
- package/dist/cjs/components/HighReactMarkdown/index.d.ts +3 -1
- package/dist/cjs/components/HighReactMarkdown/index.js +24 -4
- package/dist/cjs/components/HighReactMarkdown/index.js.map +1 -1
- package/dist/cjs/defined.d.ts +8 -0
- package/dist/cjs/utils/remarkMathBracket.d.ts +7 -0
- package/dist/cjs/utils/remarkMathBracket.js +27 -0
- package/dist/cjs/utils/remarkMathBracket.js.map +1 -0
- package/dist/esm/MarkdownCMD/index.js +2 -2
- package/dist/esm/MarkdownCMD/index.js.map +1 -1
- package/dist/esm/components/HighReactMarkdown/index.d.ts +3 -1
- package/dist/esm/components/HighReactMarkdown/index.js +25 -5
- package/dist/esm/components/HighReactMarkdown/index.js.map +1 -1
- package/dist/esm/defined.d.ts +8 -0
- package/dist/esm/utils/remarkMathBracket.d.ts +7 -0
- package/dist/esm/utils/remarkMathBracket.js +23 -0
- package/dist/esm/utils/remarkMathBracket.js.map +1 -0
- package/dist/katex.css +1 -0
- package/package.json +13 -5
package/README.ja.md
CHANGED
|
@@ -38,6 +38,7 @@
|
|
|
38
38
|
- 高頻度タイピングサポート(`requestAnimationFrame` モードでは `0ms` に近いタイピング間隔をサポート)
|
|
39
39
|
- フレーム同期レンダリング、ブラウザの 60fps と完璧にマッチ
|
|
40
40
|
- スマート文字バッチ処理により、より自然な視覚効果
|
|
41
|
+
- タイピングの中断 `stop` と再開 `resume` をサポート
|
|
41
42
|
|
|
42
43
|
### 🔧 **柔軟で使いやすい**
|
|
43
44
|
|
|
@@ -45,6 +46,13 @@
|
|
|
45
46
|
- **命令的 API**:ストリーミングデータに適し、より良いパフォーマンス
|
|
46
47
|
- **ネイティブ TypeScript サポート**:完全な型ヒント
|
|
47
48
|
|
|
49
|
+
### 🧮 **数式サポート**
|
|
50
|
+
|
|
51
|
+
- **KaTeX 統合**:高性能な数式レンダリング
|
|
52
|
+
- **デュアル構文サポート**:`$...$` と `\[...\]` の2つの区切り文字
|
|
53
|
+
- **ストリーミング対応**:タイピングアニメーションでの数式の完璧なサポート
|
|
54
|
+
- **テーマ適応**:ライト/ダークテーマへの自動適応
|
|
55
|
+
|
|
48
56
|
---
|
|
49
57
|
|
|
50
58
|
## 📦 クイックインストール
|
|
@@ -64,39 +72,16 @@ pnpm add ds-markdown
|
|
|
64
72
|
|
|
65
73
|
インストール不要、ブラウザで直接使用できます:
|
|
66
74
|
|
|
75
|
+
[DEMO](https://stackblitz.com/edit/stackblitz-starters-7vcclcw7?file=index.html)
|
|
76
|
+
|
|
67
77
|
```html
|
|
68
78
|
<!-- スタイルのインポート -->
|
|
69
79
|
<link rel="stylesheet" href="https://esm.sh/ds-markdown/dist/style.css" />
|
|
80
|
+
<link rel="stylesheet" href="https://esm.sh/ds-markdown/dist/katex.css" />
|
|
70
81
|
|
|
71
82
|
<!-- コンポーネントのインポート -->
|
|
72
|
-
<script type="
|
|
73
|
-
|
|
74
|
-
"imports": {
|
|
75
|
-
"react": "https://esm.sh/react@19.1.0",
|
|
76
|
-
"react-dom/client": "https://esm.sh/react-dom@19.1.0/client",
|
|
77
|
-
"ds-markdown": "https://esm.sh/ds-markdown"
|
|
78
|
-
}
|
|
79
|
-
}
|
|
80
|
-
</script>
|
|
81
|
-
<script type="module" src="https://esm.sh/tsx"></script>
|
|
82
|
-
|
|
83
|
-
<script type="text/babel">
|
|
84
|
-
import { createRoot } from 'react-dom/client';
|
|
85
|
-
import DsMarkdown from 'ds-markdown';
|
|
86
|
-
|
|
87
|
-
const markdown = `
|
|
88
|
-
# Hello ds-markdown
|
|
89
|
-
|
|
90
|
-
これは**高性能**なタイピングアニメーションコンポーネントです!
|
|
91
|
-
|
|
92
|
-
## 特徴
|
|
93
|
-
- ⚡ 遅延ゼロのストリーミング
|
|
94
|
-
- 🎬 スムーズなタイピングアニメーション
|
|
95
|
-
- 🎯 完璧なシンタックスサポート
|
|
96
|
-
`;
|
|
97
|
-
|
|
98
|
-
const root = createRoot(document.getElementById('root'));
|
|
99
|
-
root.render(<DsMarkdown interval={20}>{markdown}</DsMarkdown>);
|
|
83
|
+
<script type="module">
|
|
84
|
+
import Markdown from 'https://esm.sh/ds-markdown';
|
|
100
85
|
</script>
|
|
101
86
|
```
|
|
102
87
|
|
|
@@ -104,6 +89,8 @@ pnpm add ds-markdown
|
|
|
104
89
|
|
|
105
90
|
### 基本的な使用法
|
|
106
91
|
|
|
92
|
+
[DEMO](https://stackblitz.com/edit/vitejs-vite-z94syu8j?file=src%2FApp.tsx)
|
|
93
|
+
|
|
107
94
|
```tsx
|
|
108
95
|
import DsMarkdown from 'ds-markdown';
|
|
109
96
|
import 'ds-markdown/style.css';
|
|
@@ -117,6 +104,23 @@ function App() {
|
|
|
117
104
|
}
|
|
118
105
|
```
|
|
119
106
|
|
|
107
|
+
### 数式サポート
|
|
108
|
+
|
|
109
|
+
```tsx
|
|
110
|
+
import DsMarkdown from 'ds-markdown';
|
|
111
|
+
import 'ds-markdown/style.css';
|
|
112
|
+
import 'ds-markdown/katex.css'; // 数式スタイルのインポート
|
|
113
|
+
|
|
114
|
+
function MathDemo() {
|
|
115
|
+
return (
|
|
116
|
+
<DsMarkdown interval={20} answerType="answer" math={{ isOpen: true, splitSymbol: 'dollar' }}>
|
|
117
|
+
# ピタゴラスの定理 直角三角形では、斜辺の二乗は二つの直角辺の二乗の和に等しい: $a^2 + b^2 = c^2$ ここで: - $a$ と $b$ は直角辺 - $c$ は斜辺 古典的な「3-4-5」三角形の場合: $c = \sqrt
|
|
118
|
+
{3 ^ (2 + 4) ^ 2} = \sqrt{25} = 5$
|
|
119
|
+
</DsMarkdown>
|
|
120
|
+
);
|
|
121
|
+
}
|
|
122
|
+
```
|
|
123
|
+
|
|
120
124
|
### AI 会話シナリオ
|
|
121
125
|
|
|
122
126
|
```tsx
|
|
@@ -173,21 +177,24 @@ React 19 は多くのエキサイティングな新機能をもたらします
|
|
|
173
177
|
| `timerType` | `'setTimeout'` \| `'requestAnimationFrame'` | タイマータイプ | 現在のデフォルトは`setTimeout`、後で`requestAnimationFrame`に変更予定 |
|
|
174
178
|
| `answerType` | `'thinking'` \| `'answer'` | コンテンツタイプ | `'answer'` |
|
|
175
179
|
| `theme` | `'light'` \| `'dark'` | テーマタイプ | `'light'` |
|
|
180
|
+
| `math` | `IMarkdownMath` | 数式設定 | `{ isOpen: false, splitSymbol: 'dollar' }` |
|
|
176
181
|
| `onEnd` | `(data: EndData) => void` | タイピング完了コールバック | - |
|
|
177
182
|
| `onStart` | `(data: StartData) => void` | タイピング開始コールバック | - |
|
|
178
183
|
| `onTypedChar` | `(data: CharData) => void` | 文字ごとのタイピングコールバック | - |
|
|
179
184
|
|
|
180
|
-
###
|
|
185
|
+
### 数式設定
|
|
181
186
|
|
|
182
|
-
|
|
183
|
-
|
|
187
|
+
| プロパティ | 型 | 説明 | デフォルト |
|
|
188
|
+
| ------------- | ------------------------- | ---------------------------- | ---------- |
|
|
189
|
+
| `isOpen` | `boolean` | 数式レンダリングを有効にする | `false` |
|
|
190
|
+
| `splitSymbol` | `'dollar'` \| `'bracket'` | 数式区切り文字タイプ | `'dollar'` |
|
|
184
191
|
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
|
|
192
|
+
**区切り文字の説明:**
|
|
193
|
+
|
|
194
|
+
- `'dollar'`:`$...$` と `$$...$$` 構文を使用
|
|
195
|
+
- `'bracket'`:`\(...\)` と `\[...\]` 構文を使用
|
|
196
|
+
|
|
197
|
+
### 命令的 API(ストリーミングシナリオにおすすめ)
|
|
191
198
|
|
|
192
199
|
| メソッド | パラメータ | 説明 |
|
|
193
200
|
| ----------------- | ------------------------------------------- | ------------------------------------ |
|
|
@@ -206,50 +213,115 @@ markdownRef.current?.resume(); // アニメーションを再開
|
|
|
206
213
|
|
|
207
214
|
---
|
|
208
215
|
|
|
209
|
-
##
|
|
216
|
+
## 🧮 数式使用ガイド
|
|
217
|
+
|
|
218
|
+
### 基本構文
|
|
219
|
+
|
|
220
|
+
```tsx
|
|
221
|
+
// 1. 数式サポートを有効にする
|
|
222
|
+
<DsMarkdown math={{ isOpen: true }}>
|
|
223
|
+
# 数式の例
|
|
224
|
+
|
|
225
|
+
// インライン数式
|
|
226
|
+
これはインライン数式です:$E = mc^2$
|
|
227
|
+
|
|
228
|
+
// ブロック数式
|
|
229
|
+
$$\int_{-\infty}^{\infty} e^{-x^2} dx = \sqrt{\pi}$$
|
|
230
|
+
</DsMarkdown>
|
|
231
|
+
```
|
|
232
|
+
|
|
233
|
+
### 区切り文字の選択
|
|
234
|
+
|
|
235
|
+
```tsx
|
|
236
|
+
// ドル記号区切り文字を使用(デフォルト)
|
|
237
|
+
<DsMarkdown math={{ isOpen: true, splitSymbol: 'dollar' }}>
|
|
238
|
+
インライン:$a + b = c$
|
|
239
|
+
ブロック:$$\sum_{i=1}^{n} x_i = x_1 + x_2 + \cdots + x_n$$
|
|
240
|
+
</DsMarkdown>
|
|
241
|
+
|
|
242
|
+
// 括弧区切り文字を使用
|
|
243
|
+
<DsMarkdown math={{ isOpen: true, splitSymbol: 'bracket' }}>
|
|
244
|
+
インライン:\(a + b = c\)
|
|
245
|
+
ブロック:\[\sum_{i=1}^{n} x_i = x_1 + x_2 + \cdots + x_n\]
|
|
246
|
+
</DsMarkdown>
|
|
247
|
+
```
|
|
248
|
+
|
|
249
|
+
### ストリーミング数式
|
|
250
|
+
|
|
251
|
+
```tsx
|
|
252
|
+
// ストリーミング出力での数式の完璧なサポート
|
|
253
|
+
const mathContent = ['ピタゴラスの定理:', '$a^2 + b^2 = c^2$', '\n\n', 'ここで:', '- $a$ と $b$ は直角辺', '- $c$ は斜辺'];
|
|
254
|
+
|
|
255
|
+
mathContent.forEach((chunk) => {
|
|
256
|
+
markdownRef.current?.push(chunk, 'answer');
|
|
257
|
+
});
|
|
258
|
+
```
|
|
259
|
+
|
|
260
|
+
### スタイルカスタマイズ
|
|
261
|
+
|
|
262
|
+
```css
|
|
263
|
+
/* 数式スタイルのカスタマイズ */
|
|
264
|
+
.katex {
|
|
265
|
+
font-size: 1.1em;
|
|
266
|
+
}
|
|
267
|
+
|
|
268
|
+
.katex-display {
|
|
269
|
+
margin: 1em 0;
|
|
270
|
+
text-align: center;
|
|
271
|
+
}
|
|
272
|
+
|
|
273
|
+
/* ダークテーマ適応 */
|
|
274
|
+
[data-theme='dark'] .katex {
|
|
275
|
+
color: #e1e1e1;
|
|
276
|
+
}
|
|
277
|
+
```
|
|
278
|
+
|
|
279
|
+
---
|
|
280
|
+
|
|
281
|
+
## 🎛️ タイマーモード詳細
|
|
210
282
|
|
|
211
283
|
### `requestAnimationFrame` モード 🌟(推奨)
|
|
212
284
|
|
|
213
285
|
```typescript
|
|
214
286
|
// 🎯 特徴
|
|
215
287
|
- 時間駆動:実際の経過時間に基づいて文字数を計算
|
|
216
|
-
-
|
|
217
|
-
-
|
|
218
|
-
- 高頻度最適化:interval < 16ms
|
|
288
|
+
- バッチ処理:1フレーム内で複数の文字を処理可能
|
|
289
|
+
- フレーム同期:ブラウザの60fpsリフレッシュレートと同期
|
|
290
|
+
- 高頻度最適化:interval < 16msの高速タイピングを完璧にサポート
|
|
219
291
|
|
|
220
292
|
// 🎯 適用シナリオ
|
|
221
|
-
-
|
|
293
|
+
- モダンWebアプリケーションのデフォルト選択
|
|
222
294
|
- 滑らかなアニメーション効果を追求
|
|
223
|
-
- 高頻度タイピング(interval > 0
|
|
224
|
-
- AI
|
|
295
|
+
- 高頻度タイピング(interval > 0で十分)
|
|
296
|
+
- AIリアルタイム会話シナリオ
|
|
225
297
|
```
|
|
226
298
|
|
|
227
299
|
### `setTimeout` モード 📟(互換性)
|
|
228
300
|
|
|
229
301
|
```typescript
|
|
230
302
|
// 🎯 特徴
|
|
231
|
-
-
|
|
232
|
-
-
|
|
233
|
-
-
|
|
234
|
-
-
|
|
303
|
+
- 単一文字:毎回正確に1文字を処理
|
|
304
|
+
- 固定間隔:設定された時間に厳密に実行
|
|
305
|
+
- ビート感:クラシックタイプライターのリズム感
|
|
306
|
+
- 精密制御:特定のタイミング要件に適している
|
|
235
307
|
|
|
236
308
|
// 🎯 適用シナリオ
|
|
237
|
-
-
|
|
238
|
-
-
|
|
309
|
+
- 精密な時間制御が必要
|
|
310
|
+
- レトロタイプライター効果を演出
|
|
239
311
|
- 互換性要件の高いシナリオ
|
|
240
312
|
```
|
|
241
313
|
|
|
242
314
|
### 📊 パフォーマンス比較
|
|
243
315
|
|
|
244
|
-
|
|
|
245
|
-
| -------------------------------- |
|
|
246
|
-
| **文字処理** |
|
|
247
|
-
| **高頻度間隔** | ✅ 優秀(5ms →
|
|
248
|
-
| **低頻度間隔** | ✅
|
|
249
|
-
| **視覚効果** | 🎬 滑らかなアニメーション感
|
|
250
|
-
| **パフォーマンスオーバーヘッド** | 🟢 低(フレーム同期)
|
|
316
|
+
| 特徴 | requestAnimationFrame | setTimeout |
|
|
317
|
+
| -------------------------------- | ----------------------------------- | ----------------- |
|
|
318
|
+
| **文字処理** | 1フレームで複数文字を処理可能 | 毎回1文字を処理 |
|
|
319
|
+
| **高頻度間隔** | ✅ 優秀(5ms → 1フレーム3文字) | ❌ ラグの可能性 |
|
|
320
|
+
| **低頻度間隔** | ✅ 正常(100ms → 6フレーム後1文字) | ✅ 精密 |
|
|
321
|
+
| **視覚効果** | 🎬 滑らかなアニメーション感 | ⚡ 精密なビート感 |
|
|
322
|
+
| **パフォーマンスオーバーヘッド** | 🟢 低(フレーム同期) | 🟡 中(タイマー) |
|
|
251
323
|
|
|
252
|
-
|
|
324
|
+
高頻度は`requestAnimationFrame`、低頻度は`setTimeout`を推奨
|
|
253
325
|
|
|
254
326
|
---
|
|
255
327
|
|
|
@@ -257,6 +329,8 @@ markdownRef.current?.resume(); // アニメーションを再開
|
|
|
257
329
|
|
|
258
330
|
### 📝 AI ストリーミング会話
|
|
259
331
|
|
|
332
|
+
[DEMO: 🔧 StackBlitz 体験](https://stackblitz.com/edit/vitejs-vite-2ri8kex3?file=src%2FApp.tsx)
|
|
333
|
+
|
|
260
334
|
````tsx
|
|
261
335
|
import { useRef } from 'react';
|
|
262
336
|
import { MarkdownCMD, MarkdownCMDRef } from 'ds-markdown';
|
|
@@ -271,18 +345,18 @@ function StreamingChat() {
|
|
|
271
345
|
// 思考段階
|
|
272
346
|
markdownRef.current?.push('🤔 あなたの質問を分析しています...', 'thinking');
|
|
273
347
|
await delay(1000);
|
|
274
|
-
markdownRef.current?.push('\n\n✅
|
|
348
|
+
markdownRef.current?.push('\n\n✅ 分析完了、回答を開始', 'thinking');
|
|
275
349
|
|
|
276
350
|
// ストリーミング回答
|
|
277
351
|
const chunks = [
|
|
278
|
-
'# React 19
|
|
352
|
+
'# React 19 新機能解析\n\n',
|
|
279
353
|
'## 🚀 React Compiler\n',
|
|
280
|
-
'React 19
|
|
281
|
-
'- 🎯 **自動最適化**:手動の
|
|
282
|
-
'- ⚡
|
|
283
|
-
'- 🔧
|
|
284
|
-
'## 📝 Actions
|
|
285
|
-
'新しい
|
|
354
|
+
'React 19 の最大のハイライトは**React Compiler**の導入です:\n\n',
|
|
355
|
+
'- 🎯 **自動最適化**:手動のmemoとuseMemoが不要\n',
|
|
356
|
+
'- ⚡ **パフォーマンス向上**:コンパイル時最適化、実行時ゼロオーバーヘッド\n',
|
|
357
|
+
'- 🔧 **後方互換性**:既存コードの修正不要\n\n',
|
|
358
|
+
'## 📝 Actions フォーム簡素化\n',
|
|
359
|
+
'新しいActions APIによりフォーム処理がより簡単になります:\n\n',
|
|
286
360
|
'```tsx\n',
|
|
287
361
|
'function ContactForm({ action }) {\n',
|
|
288
362
|
' const [state, formAction] = useActionState(action, null);\n',
|
|
@@ -294,7 +368,7 @@ function StreamingChat() {
|
|
|
294
368
|
' );\n',
|
|
295
369
|
'}\n',
|
|
296
370
|
'```\n\n',
|
|
297
|
-
'
|
|
371
|
+
'この回答がお役に立てば幸いです!🎉',
|
|
298
372
|
];
|
|
299
373
|
|
|
300
374
|
for (const chunk of chunks) {
|
|
@@ -305,7 +379,7 @@ function StreamingChat() {
|
|
|
305
379
|
|
|
306
380
|
return (
|
|
307
381
|
<div className="chat-container">
|
|
308
|
-
<button onClick={simulateAIResponse}>🤖 React 19
|
|
382
|
+
<button onClick={simulateAIResponse}>🤖 React 19 新機能について質問</button>
|
|
309
383
|
|
|
310
384
|
<MarkdownCMD ref={markdownRef} interval={10} timerType="requestAnimationFrame" onEnd={(data) => console.log('段落完了:', data)} />
|
|
311
385
|
</div>
|
|
@@ -315,9 +389,46 @@ function StreamingChat() {
|
|
|
315
389
|
const delay = (ms: number) => new Promise((resolve) => setTimeout(resolve, ms));
|
|
316
390
|
````
|
|
317
391
|
|
|
318
|
-
###
|
|
392
|
+
### 🧮 数式ストリーミングレンダリング
|
|
319
393
|
|
|
320
|
-
|
|
394
|
+
```tsx
|
|
395
|
+
function MathStreamingDemo() {
|
|
396
|
+
const markdownRef = useRef<MarkdownCMDRef>(null);
|
|
397
|
+
|
|
398
|
+
const simulateMathResponse = async () => {
|
|
399
|
+
markdownRef.current?.clear();
|
|
400
|
+
|
|
401
|
+
const mathChunks = [
|
|
402
|
+
'# ピタゴラスの定理の説明\n\n',
|
|
403
|
+
'直角三角形では、斜辺の二乗は二つの直角辺の二乗の和に等しい:\n\n',
|
|
404
|
+
'$a^2 + b^2 = c^2$\n\n',
|
|
405
|
+
'ここで:\n',
|
|
406
|
+
'- $a$ と $b$ は直角辺\n',
|
|
407
|
+
'- $c$ は斜辺\n\n',
|
|
408
|
+
'古典的な「3-4-5」三角形の場合:\n',
|
|
409
|
+
'$c = \\sqrt{3^2 + 4^2} = \\sqrt{25} = 5$\n\n',
|
|
410
|
+
'この定理は幾何学で広く応用されています!',
|
|
411
|
+
];
|
|
412
|
+
|
|
413
|
+
for (const chunk of mathChunks) {
|
|
414
|
+
await delay(150);
|
|
415
|
+
markdownRef.current?.push(chunk, 'answer');
|
|
416
|
+
}
|
|
417
|
+
};
|
|
418
|
+
|
|
419
|
+
return (
|
|
420
|
+
<div>
|
|
421
|
+
<button onClick={simulateMathResponse}>📐 ピタゴラスの定理を説明</button>
|
|
422
|
+
|
|
423
|
+
<MarkdownCMD ref={markdownRef} interval={20} timerType="requestAnimationFrame" math={{ isOpen: true, splitSymbol: 'dollar' }} />
|
|
424
|
+
</div>
|
|
425
|
+
);
|
|
426
|
+
}
|
|
427
|
+
```
|
|
428
|
+
|
|
429
|
+
### 🔄 ストリーミングMarkdown構文処理
|
|
430
|
+
|
|
431
|
+
**核心問題**:ストリーミング出力時に不完全なMarkdown構文がレンダリングエラーを引き起こす
|
|
321
432
|
|
|
322
433
|
```tsx
|
|
323
434
|
// 🚨 問題シナリオ
|
|
@@ -325,47 +436,50 @@ push('#'); // "# "
|
|
|
325
436
|
push(' '); // "# "
|
|
326
437
|
push('タイトル'); // "# タイトル"
|
|
327
438
|
push('\n'); // "# タイトル\n"
|
|
328
|
-
push('1'); // "# タイトル\n1" ←
|
|
439
|
+
push('1'); // "# タイトル\n1" ← ここで段落として誤解析される
|
|
329
440
|
push('.'); // "# タイトル\n1." ← 正しいリストを形成
|
|
330
441
|
push(' 項目'); // "# タイトル\n1. 項目"
|
|
331
442
|
```
|
|
332
443
|
|
|
333
|
-
**✅
|
|
444
|
+
**✅ スマート解決策**:内蔵同期バッファリングメカニズム
|
|
334
445
|
|
|
335
446
|
```tsx
|
|
336
|
-
//
|
|
447
|
+
// コンポーネントが構文境界をインテリジェントに処理
|
|
337
448
|
const handleStreamingMarkdown = () => {
|
|
338
449
|
const chunks = ['#', ' ', '使用', 'スキル', '\n', '1', '.', ' ', 'スキル1', '\n', '2', '.', ' スキル2'];
|
|
339
450
|
|
|
340
451
|
chunks.forEach((chunk) => {
|
|
341
452
|
markdownRef.current?.push(chunk, 'answer');
|
|
342
|
-
//
|
|
453
|
+
// 遅延不要、コンポーネントが内部でインテリジェントにバッファリング
|
|
343
454
|
});
|
|
344
455
|
};
|
|
345
456
|
|
|
346
|
-
// 🧠
|
|
347
|
-
// 1. "# 使用スキル\n1"
|
|
348
|
-
// 2.
|
|
349
|
-
// 3. "." を受信して "1."
|
|
350
|
-
// 4.
|
|
457
|
+
// 🧠 インテリジェント処理フロー:
|
|
458
|
+
// 1. "# 使用スキル\n1" のような不完全な構文をリアルタイム検出
|
|
459
|
+
// 2. インテリジェントバッファリング、より多くの文字を待機
|
|
460
|
+
// 3. "." を受信して "1." を形成した後すぐに処理
|
|
461
|
+
// 4. ゼロ遅延、純粋な同期処理
|
|
351
462
|
```
|
|
352
463
|
|
|
353
464
|
**サポートされる構文検出**:
|
|
354
465
|
|
|
355
466
|
````typescript
|
|
356
|
-
// ✅
|
|
357
|
-
'## タイトル'; //
|
|
358
|
-
'1. リスト項目'; //
|
|
359
|
-
'- 項目'; //
|
|
360
|
-
'> 引用コンテンツ'; //
|
|
467
|
+
// ✅ 完全な構文(即座に処理)
|
|
468
|
+
'## タイトル'; // 完全なタイトル
|
|
469
|
+
'1. リスト項目'; // 完全なリスト項目
|
|
470
|
+
'- 項目'; // 完全な順序なしリスト
|
|
471
|
+
'> 引用コンテンツ'; // 完全な引用
|
|
361
472
|
'```javascript'; // コードブロック開始
|
|
362
473
|
'```'; // コードブロック終了
|
|
363
474
|
'改行で終わるコンテンツ\n'; // 改行境界
|
|
475
|
+
'$a + b$'; // 完全な数式
|
|
476
|
+
'$$\\sum x$$'; // 完全なブロック数式
|
|
364
477
|
|
|
365
|
-
// 🔄
|
|
478
|
+
// 🔄 不完全な構文(インテリジェントバッファリング)
|
|
366
479
|
'##'; // タイトル記号のみ
|
|
367
480
|
'1'; // 数字のみ
|
|
368
|
-
'```java'; //
|
|
481
|
+
'```java'; // 可能性のあるコードブロック開始
|
|
482
|
+
'$a +'; // 不完全な数式
|
|
369
483
|
````
|
|
370
484
|
|
|
371
485
|
---
|
|
@@ -378,37 +492,52 @@ const handleStreamingMarkdown = () => {
|
|
|
378
492
|
// ✅ 推奨設定
|
|
379
493
|
<DsMarkdown
|
|
380
494
|
timerType="requestAnimationFrame"
|
|
381
|
-
interval={15} // 15-30ms
|
|
495
|
+
interval={15} // 15-30msが最適な体験
|
|
382
496
|
/>
|
|
383
497
|
|
|
384
|
-
// ❌
|
|
498
|
+
// ❌ 小さすぎる間隔を避ける
|
|
385
499
|
<DsMarkdown interval={1} /> // パフォーマンス問題を引き起こす可能性
|
|
386
500
|
```
|
|
387
501
|
|
|
388
502
|
### 2. ストリーミングデータ処理
|
|
389
503
|
|
|
390
504
|
```tsx
|
|
391
|
-
// ✅ 推奨:命令的
|
|
505
|
+
// ✅ 推奨:命令的API
|
|
392
506
|
const ref = useRef<MarkdownCMDRef>(null);
|
|
393
507
|
useEffect(() => {
|
|
394
508
|
ref.current?.push(newChunk, 'answer');
|
|
395
509
|
}, [newChunk]);
|
|
396
510
|
|
|
397
|
-
// ❌ 避ける:頻繁な
|
|
511
|
+
// ❌ 避ける:頻繁なchildren更新
|
|
398
512
|
const [content, setContent] = useState('');
|
|
399
|
-
//
|
|
513
|
+
// 毎回の更新でコンテンツ全体を再解析
|
|
514
|
+
```
|
|
515
|
+
|
|
516
|
+
### 3. 数式最適化
|
|
517
|
+
|
|
518
|
+
```tsx
|
|
519
|
+
// ✅ 推奨:数式スタイルを必要に応じて読み込み
|
|
520
|
+
import 'ds-markdown/style.css';
|
|
521
|
+
import 'ds-markdown/katex.css'; // 必要な時のみインポート
|
|
522
|
+
|
|
523
|
+
// ✅ 推奨:区切り文字の合理的な使用
|
|
524
|
+
// シンプルな数式には $...$ で簡潔さを
|
|
525
|
+
// 複雑な数式には $$...$$ で明確さを
|
|
526
|
+
|
|
527
|
+
// ❌ 避ける:不要な時に数式を有効にする
|
|
528
|
+
<DsMarkdown math={{ isOpen: true }}>プレーンテキストコンテンツ</DsMarkdown>;
|
|
400
529
|
```
|
|
401
530
|
|
|
402
|
-
###
|
|
531
|
+
### 4. 型安全性
|
|
403
532
|
|
|
404
533
|
```tsx
|
|
405
534
|
import { MarkdownCMDRef } from 'ds-markdown';
|
|
406
535
|
|
|
407
536
|
const ref = useRef<MarkdownCMDRef>(null);
|
|
408
|
-
// 完全な
|
|
537
|
+
// 完全なTypeScript型ヒント
|
|
409
538
|
```
|
|
410
539
|
|
|
411
|
-
###
|
|
540
|
+
### 5. スタイルカスタマイズ
|
|
412
541
|
|
|
413
542
|
```css
|
|
414
543
|
/* 思考エリアスタイル */
|
|
@@ -448,18 +577,33 @@ const ref = useRef<MarkdownCMDRef>(null);
|
|
|
448
577
|
padding: 8px 12px;
|
|
449
578
|
text-align: left;
|
|
450
579
|
}
|
|
580
|
+
|
|
581
|
+
/* 数式スタイル */
|
|
582
|
+
.katex {
|
|
583
|
+
font-size: 1.1em;
|
|
584
|
+
}
|
|
585
|
+
|
|
586
|
+
.katex-display {
|
|
587
|
+
margin: 1em 0;
|
|
588
|
+
text-align: center;
|
|
589
|
+
}
|
|
590
|
+
|
|
591
|
+
/* ダークテーマ数式 */
|
|
592
|
+
[data-theme='dark'] .katex {
|
|
593
|
+
color: #e1e1e1;
|
|
594
|
+
}
|
|
451
595
|
```
|
|
452
596
|
|
|
453
597
|
---
|
|
454
598
|
|
|
455
599
|
## 🌐 互換性
|
|
456
600
|
|
|
457
|
-
| 環境 | バージョン要件 | 説明
|
|
458
|
-
| -------------- | ----------------------------------- |
|
|
459
|
-
| **React** | 16.8.0+ | Hooks
|
|
460
|
-
| **TypeScript** | 4.0+ |
|
|
461
|
-
| **ブラウザ** | Chrome 60+, Firefox 55+, Safari 12+ | モダンブラウザ
|
|
462
|
-
| **Node.js** | 14.0+ | ビルド環境
|
|
601
|
+
| 環境 | バージョン要件 | 説明 |
|
|
602
|
+
| -------------- | ----------------------------------- | ------------------- |
|
|
603
|
+
| **React** | 16.8.0+ | Hooksサポートが必要 |
|
|
604
|
+
| **TypeScript** | 4.0+ | オプションだが推奨 |
|
|
605
|
+
| **ブラウザ** | Chrome 60+, Firefox 55+, Safari 12+ | モダンブラウザ |
|
|
606
|
+
| **Node.js** | 14.0+ | ビルド環境 |
|
|
463
607
|
|
|
464
608
|
---
|
|
465
609
|
|
|
@@ -467,7 +611,7 @@ const ref = useRef<MarkdownCMDRef>(null);
|
|
|
467
611
|
|
|
468
612
|
Issue と Pull Request の提出を歓迎します!
|
|
469
613
|
|
|
470
|
-
1.
|
|
614
|
+
1. このリポジトリをFork
|
|
471
615
|
2. 機能ブランチを作成:`git checkout -b feature/amazing-feature`
|
|
472
616
|
3. 変更をコミット:`git commit -m 'Add amazing feature'`
|
|
473
617
|
4. ブランチをプッシュ:`git push origin feature/amazing-feature`
|
|
@@ -482,11 +626,11 @@ MIT © [onshinpei](https://github.com/onshinpei)
|
|
|
482
626
|
---
|
|
483
627
|
|
|
484
628
|
<div align="center">
|
|
485
|
-
<strong>このプロジェクトがお役に立てば、⭐️ Star
|
|
629
|
+
<strong>このプロジェクトがお役に立てば、⭐️ Star をお願いします!</strong>
|
|
486
630
|
|
|
487
631
|
<br><br>
|
|
488
632
|
|
|
489
633
|
[🐛 問題報告](https://github.com/onshinpei/ds-markdown/issues) |
|
|
490
634
|
[💡 機能提案](https://github.com/onshinpei/ds-markdown/issues) |
|
|
491
|
-
[📖
|
|
635
|
+
[📖 ドキュメント閲覧](https://onshinpei.github.io/ds-markdown/)
|
|
492
636
|
</div>
|
package/README.ko.md
CHANGED
|
@@ -45,6 +45,13 @@
|
|
|
45
45
|
- **명령형 API**: 스트리밍 데이터에 적합, 더 나은 성능
|
|
46
46
|
- **네이티브 TypeScript 지원**: 완전한 타입 힌트
|
|
47
47
|
|
|
48
|
+
### 🧮 **수식 지원**
|
|
49
|
+
|
|
50
|
+
- **KaTeX 통합**: 고성능 수식 렌더링
|
|
51
|
+
- **이중 구문 지원**: `$...$` 및 `\[...\]` 구분자
|
|
52
|
+
- **스트리밍 호환**: 타이핑 애니메이션에서 수식의 완벽한 지원
|
|
53
|
+
- **테마 적응**: 라이트/다크 테마에 자동 적응
|
|
54
|
+
|
|
48
55
|
---
|
|
49
56
|
|
|
50
57
|
## 📦 빠른 설치
|