ds-markdown 0.1.2-beta.2 โ 0.1.2
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 +542 -28
- package/README.ja.md +289 -33
- package/README.ko.md +245 -28
- package/README.md +397 -28
- package/dist/cjs/Markdown/index.js +3 -0
- package/dist/cjs/Markdown/index.js.map +1 -1
- package/dist/cjs/MarkdownCMD/index.js +26 -13
- package/dist/cjs/MarkdownCMD/index.js.map +1 -1
- package/dist/cjs/defined.d.ts +15 -6
- package/dist/cjs/hooks/useTypingTask.d.ts +4 -1
- package/dist/cjs/hooks/useTypingTask.js +82 -57
- package/dist/cjs/hooks/useTypingTask.js.map +1 -1
- package/dist/esm/Markdown/index.js +3 -0
- package/dist/esm/Markdown/index.js.map +1 -1
- package/dist/esm/MarkdownCMD/index.js +26 -13
- package/dist/esm/MarkdownCMD/index.js.map +1 -1
- package/dist/esm/defined.d.ts +15 -6
- package/dist/esm/hooks/useTypingTask.d.ts +4 -1
- package/dist/esm/hooks/useTypingTask.js +82 -57
- package/dist/esm/hooks/useTypingTask.js.map +1 -1
- package/package.json +2 -2
package/README.ko.md
CHANGED
|
@@ -18,6 +18,57 @@
|
|
|
18
18
|
|
|
19
19
|
---
|
|
20
20
|
|
|
21
|
+
## ๐ ๋ชฉ์ฐจ
|
|
22
|
+
|
|
23
|
+
- [โจ ํต์ฌ ๊ธฐ๋ฅ](#-ํต์ฌ-๊ธฐ๋ฅ)
|
|
24
|
+
- [๐ฆ ๋น ๋ฅธ ์ค์น](#-๋น ๋ฅธ-์ค์น)
|
|
25
|
+
- [๐ 5๋ถ ๋น ๋ฅธ ์์](#-5๋ถ-๋น ๋ฅธ-์์)
|
|
26
|
+
- [๊ธฐ๋ณธ ์ฌ์ฉ๋ฒ](#๊ธฐ๋ณธ-์ฌ์ฉ๋ฒ)
|
|
27
|
+
- [ํ์ดํ ์ ๋๋ฉ์ด์
๋นํ์ฑํ](#ํ์ดํ-์ ๋๋ฉ์ด์
-๋นํ์ฑํ)
|
|
28
|
+
- [์ํ ๊ณต์ ์ง์](#์ํ-๊ณต์-์ง์)
|
|
29
|
+
- [AI ๋ํ ์๋๋ฆฌ์ค](#ai-๋ํ-์๋๋ฆฌ์ค)
|
|
30
|
+
- [๐ฏ ๊ณ ๊ธ ์ฝ๋ฐฑ ์ ์ด](#-๊ณ ๊ธ-์ฝ๋ฐฑ-์ ์ด)
|
|
31
|
+
- [๐ ์ ๋๋ฉ์ด์
์ฌ์์ ๋ฐ๋ชจ](#-์ ๋๋ฉ์ด์
-์ฌ์์-๋ฐ๋ชจ)
|
|
32
|
+
- [โถ๏ธ ์๋ ์์ ์ ๋๋ฉ์ด์
๋ฐ๋ชจ](#๏ธ-์๋-์์-์ ๋๋ฉ์ด์
-๋ฐ๋ชจ)
|
|
33
|
+
- [๐ ์์ API ๋ฌธ์](#-์์ -api-๋ฌธ์)
|
|
34
|
+
- [๐งฎ ์ํ ๊ณต์ ์ฌ์ฉ ๊ฐ์ด๋](#-์ํ-๊ณต์-์ฌ์ฉ-๊ฐ์ด๋)
|
|
35
|
+
- [๐ ํ๋ฌ๊ทธ์ธ ์์คํ
](#-ํ๋ฌ๊ทธ์ธ-์์คํ
)
|
|
36
|
+
- [๐๏ธ ํ์ด๋จธ ๋ชจ๋ ์์ธ](#๏ธ-ํ์ด๋จธ-๋ชจ๋-์์ธ)
|
|
37
|
+
- [๐ก ์ค์ ์์ ](#-์ค์ -์์ )
|
|
38
|
+
- [๐ง ๋ชจ๋ฒ ์ฌ๋ก](#-๋ชจ๋ฒ-์ฌ๋ก)
|
|
39
|
+
|
|
40
|
+
---
|
|
41
|
+
|
|
42
|
+
## โ ์ ds-markdown์ ์จ์ผ ํ๋์?
|
|
43
|
+
|
|
44
|
+
- **AI ์ฑํ
๊ฒฝํ ์๋ฒฝ ์ฌํ**
|
|
45
|
+
DeepSeek ๋ฑ ์ฃผ์ AI ์ฑํ
UI์ ํ์ดํ ์ ๋๋ฉ์ด์
๊ณผ ์คํธ๋ฆฌ๋ฐ ์๋ต์ 1:1๋ก ์ฌํ, "AI๊ฐ ์๊ฐ/๋ต๋ณ ์ค"์ธ ์ง์ง ๊ฐ์ ๊ฒฝํ์ ์ ๊ณตํฉ๋๋ค.
|
|
46
|
+
|
|
47
|
+
- **๋ฐฑ์๋ ์คํธ๋ฆฌ๋ฐ ๋ฐ์ดํฐ ์๋ฒฝ ๋์**
|
|
48
|
+
๋ง์ AI/LLM ๋ฐฑ์๋(OpenAI, DeepSeek ๋ฑ)๋ ํ ๋ฒ์ ์ฌ๋ฌ ๊ธ์๊ฐ ํฌํจ๋ chunk๋ฅผ ๋ณด๋
๋๋ค.
|
|
49
|
+
**ds-markdown์ ๊ฐ chunk๋ฅผ ์๋์ผ๋ก ํ ๊ธ์์ฉ ๋ถ๋ฆฌํด, ๋ฐฑ์๋๊ฐ ์ฌ๋ฌ ๊ธ์๋ฅผ ํ ๋ฒ์ ๋ณด๋ด๋ ํญ์ ๋ถ๋๋ฝ๊ฒ ํ ๊ธ์์ฉ ํ์ดํ ์ ๋๋ฉ์ด์
์ ๋ณด์ฌ์ค๋๋ค.**
|
|
50
|
+
|
|
51
|
+
- **์๋ฒฝํ Markdown & ์์ ์ง์**
|
|
52
|
+
KaTeX ๋ด์ฅ, ๋ชจ๋ ์ฃผ์ Markdown ๊ตฌ๋ฌธ๊ณผ ์์ ์ง์โ๊ธฐ์ Q&A, ๊ต์ก, ์ง์๋ฒ ์ด์ค์ ์ต์ .
|
|
53
|
+
|
|
54
|
+
- **์ต๊ณ ์ ๊ฐ๋ฐ ๊ฒฝํ**
|
|
55
|
+
ํ๋ถํ ๋ช
๋ นํ API, ์คํธ๋ฆฌ๋ฐ ๋ฐ์ดํฐ, ๋น๋๊ธฐ ์ฝ๋ฐฑ, ํ๋ฌ๊ทธ์ธ ํ์ฅ ๋ฑ์ผ๋ก ์ ์ฐํ ์ ์ด ๊ฐ๋ฅ.
|
|
56
|
+
|
|
57
|
+
- **๊ฐ๋ณ๊ณ ๊ณ ์ฑ๋ฅ**
|
|
58
|
+
์์ ์ฉ๋, ๋น ๋ฅธ ์๋, ๋ชจ๋ฐ์ผ/๋ฐ์คํฌํ ๋ชจ๋ ์ง์. ํต์ฌ ์์กด์ฑ์ [react-markdown](https://github.com/remarkjs/react-markdown) (์
๊ณ ํ์ค์ ์ฑ์ํ Markdown ๋ ๋๋ฌ) ํ๋๋ฟ์ด๋ฉฐ, ๊ทธ ์ธ ๋ฌด๊ฑฐ์ด ์์กด์ฑ์ ์์ต๋๋ค. ๋ฐ๋ก ์ฌ์ฉ ๊ฐ๋ฅํฉ๋๋ค.
|
|
59
|
+
|
|
60
|
+
- **๋ค์ค ํ
๋ง ๋ฐ ํ๋ฌ๊ทธ์ธ ์ํคํ
์ฒ**
|
|
61
|
+
๋ผ์ดํธ/๋คํฌ ํ
๋ง ์ ํ, remark/rehype ํ๋ฌ๊ทธ์ธ ํธํ, ๊ณ ๊ธ ํ์ฅ์ฑ.
|
|
62
|
+
|
|
63
|
+
- **๋ค์ํ ํ์ฉ ์ฌ๋ก**
|
|
64
|
+
- AI ์ฑ๋ด/์ด์์คํดํธ
|
|
65
|
+
- ์ค์๊ฐ Q&A/์ง์๋ฒ ์ด์ค
|
|
66
|
+
- ๊ต์ก/์ํ/ํ๋ก๊ทธ๋๋ฐ ์ฝํ
์ธ
|
|
67
|
+
- ์ ํ ๋ฐ๋ชจ, ์ธํฐ๋ํฐ๋ธ ๋ฌธ์
|
|
68
|
+
- "ํ์๊ธฐ" ์ ๋๋ฉ์ด์
๊ณผ ์คํธ๋ฆฌ๋ฐ Markdown์ด ํ์ํ ๋ชจ๋ ์ํฉ
|
|
69
|
+
|
|
70
|
+
---
|
|
71
|
+
|
|
21
72
|
## โจ ํต์ฌ ๊ธฐ๋ฅ
|
|
22
73
|
|
|
23
74
|
### ๐ค **AI ๋ํ ์๋๋ฆฌ์ค**
|
|
@@ -194,28 +245,43 @@ React 19๋ ๋ง์ ํฅ๋ฏธ๋ก์ด ์ ๊ธฐ๋ฅ์ ์ ๊ณตํฉ๋๋ค:
|
|
|
194
245
|
import DsMarkdown, { MarkdownCMD } from 'ds-markdown';
|
|
195
246
|
```
|
|
196
247
|
|
|
197
|
-
| ์์ฑ
|
|
198
|
-
|
|
|
199
|
-
| `interval`
|
|
200
|
-
| `timerType`
|
|
201
|
-
| `answerType`
|
|
202
|
-
| `theme`
|
|
203
|
-
| `plugins`
|
|
204
|
-
| `math`
|
|
205
|
-
| `onEnd`
|
|
206
|
-
| `onStart`
|
|
207
|
-
| `
|
|
208
|
-
| `
|
|
248
|
+
| ์์ฑ | ํ์
| ์ค๋ช
| ๊ธฐ๋ณธ๊ฐ |
|
|
249
|
+
| ------------------- | ------------------------------------------- | ---------------------------------------------------------- | ---------------------------------------------------------------------- |
|
|
250
|
+
| `interval` | `number` | ํ์ดํ ๊ฐ๊ฒฉ (๋ฐ๋ฆฌ์ด) | `30` |
|
|
251
|
+
| `timerType` | `'setTimeout'` \| `'requestAnimationFrame'` | ํ์ด๋จธ ํ์
| ํ์ฌ ๊ธฐ๋ณธ๊ฐ์ `setTimeout`, ๋์ค์ `requestAnimationFrame`๋ก ๋ณ๊ฒฝ ์์ |
|
|
252
|
+
| `answerType` | `'thinking'` \| `'answer'` | ์ฝํ
์ธ ํ์
(์คํ์ผ ์ํฅ) | `'answer'` |
|
|
253
|
+
| `theme` | `'light'` \| `'dark'` | ํ
๋ง ํ์
| `'light'` |
|
|
254
|
+
| `plugins` | `IMarkdownPlugin[]` | ํ๋ฌ๊ทธ์ธ ์ค์ | `[]` |
|
|
255
|
+
| `math` | [IMarkdownMath](#IMarkdownMath) | ์ํ ๊ณต์ ์ค์ | `{ splitSymbol: 'dollar' }` |
|
|
256
|
+
| `onEnd` | `(data: EndData) => void` | ํ์ดํ ์๋ฃ ์ฝ๋ฐฑ | - |
|
|
257
|
+
| `onStart` | `(data: StartData) => void` | ํ์ดํ ์์ ์ฝ๋ฐฑ | - |
|
|
258
|
+
| `onBeforeTypedChar` | `(data: IBeforeTypedChar) => Promise<void>` | ๋ฌธ์ ํ์ดํ ์ ์ฝ๋ฐฑ, ๋น๋๊ธฐ ์์
์ง์, ํ์ ํ์ดํ ์ฐจ๋จ | - |
|
|
259
|
+
| `onTypedChar` | `(data: ITypedChar) => void` | ๋ฌธ์ ํ์ดํ ํ ์ฝ๋ฐฑ | - |
|
|
260
|
+
| `disableTyping` | `boolean` | ํ์ดํ ์ ๋๋ฉ์ด์
๋นํ์ฑํ | `false` |
|
|
261
|
+
| `autoStartTyping` | `boolean` | ํ์ดํ ์ ๋๋ฉ์ด์
์๋ ์์ ์ฌ๋ถ, false์ธ ๊ฒฝ์ฐ ์๋ ํธ๋ฆฌ๊ฑฐ | `true` |
|
|
209
262
|
|
|
210
263
|
> ์ฐธ๊ณ : ํ์ดํ ์ค์ `disableTyping`์ด `true`์์ `false`๋ก ๋ณ๊ฒฝ๋๋ฉด ๋ค์ ํ์ดํ ํธ๋ฆฌ๊ฑฐ ์ ๋จ์ ๋ชจ๋ ๋ฌธ์๊ฐ ํ ๋ฒ์ ํ์๋ฉ๋๋ค.
|
|
211
264
|
|
|
265
|
+
### IBeforeTypedChar
|
|
266
|
+
|
|
267
|
+
| ์์ฑ | ํ์
| ์ค๋ช
| ๊ธฐ๋ณธ๊ฐ |
|
|
268
|
+
| -------------- | ------------ | ------------------------------ | ------ |
|
|
269
|
+
| `currentIndex` | `number` | ์ ์ฒด ๋ฌธ์์ด์์ ํ์ฌ ์ธ๋ฑ์ค | `0` |
|
|
270
|
+
| `currentChar` | `string` | ํ์ดํ ์์ ๋ฌธ์ | - |
|
|
271
|
+
| `answerType` | `AnswerType` | ์ฝํ
์ธ ํ์
(thinking/answer) | - |
|
|
272
|
+
| `prevStr` | `string` | ํ์ฌ ํ์
์ฝํ
์ธ ์ ์ด์ ๋ฌธ์์ด | - |
|
|
273
|
+
| `percent` | `number` | ํ์ดํ ์งํ๋ฅ ๋ฐฑ๋ถ์จ (0-100) | `0` |
|
|
274
|
+
|
|
212
275
|
### ITypedChar
|
|
213
276
|
|
|
214
|
-
| ์์ฑ | ํ์
|
|
215
|
-
| -------------- |
|
|
216
|
-
| `
|
|
217
|
-
| `currentChar` | `string`
|
|
218
|
-
| `
|
|
277
|
+
| ์์ฑ | ํ์
| ์ค๋ช
| ๊ธฐ๋ณธ๊ฐ |
|
|
278
|
+
| -------------- | ------------ | -------------------------------- | ------ |
|
|
279
|
+
| `currentIndex` | `number` | ์ ์ฒด ๋ฌธ์์ด์์ ํ์ฌ ์ธ๋ฑ์ค | `0` |
|
|
280
|
+
| `currentChar` | `string` | ํ์ดํ๋ ๋ฌธ์ | - |
|
|
281
|
+
| `answerType` | `AnswerType` | ์ฝํ
์ธ ํ์
(thinking/answer) | - |
|
|
282
|
+
| `prevStr` | `string` | ํ์ฌ ํ์
์ฝํ
์ธ ์ ์ด์ ๋ฌธ์์ด | - |
|
|
283
|
+
| `currentStr` | `string` | ํ์ฌ ํ์
์ฝํ
์ธ ์ ์์ ํ ๋ฌธ์์ด | - |
|
|
284
|
+
| `percent` | `number` | ํ์ดํ ์งํ๋ฅ ๋ฐฑ๋ถ์จ (0-100) | `0` |
|
|
219
285
|
|
|
220
286
|
#### IMarkdownMath
|
|
221
287
|
|
|
@@ -241,26 +307,32 @@ import DsMarkdown, { MarkdownCMD } from 'ds-markdown';
|
|
|
241
307
|
|
|
242
308
|
#### ๊ธฐ๋ณธ ๋ด๋ณด๋ด๊ธฐ DsMarkdown
|
|
243
309
|
|
|
244
|
-
| ๋ฉ์๋
|
|
245
|
-
|
|
|
246
|
-
| `
|
|
247
|
-
| `
|
|
310
|
+
| ๋ฉ์๋ | ๋งค๊ฐ๋ณ์ | ์ค๋ช
|
|
|
311
|
+
| --------- | -------- | ----------------------------------------------------- |
|
|
312
|
+
| `start` | - | ํ์ดํ ์ ๋๋ฉ์ด์
์์ |
|
|
313
|
+
| `stop` | - | ํ์ดํ ์ผ์์ ์ง |
|
|
314
|
+
| `resume` | - | ํ์ดํ ์ฌ๊ฐ |
|
|
315
|
+
| `restart` | - | ํ์ดํ ์ ๋๋ฉ์ด์
์ฌ์์, ํ์ฌ ์ฝํ
์ธ ๋ฅผ ์ฒ์๋ถํฐ ์ฌ์ |
|
|
248
316
|
|
|
249
317
|
#### MarkdownCMD ๋
ธ์ถ ๋ฉ์๋
|
|
250
318
|
|
|
251
|
-
| ๋ฉ์๋ | ๋งค๊ฐ๋ณ์ | ์ค๋ช
|
|
252
|
-
| ----------------- | ------------------------------------------- |
|
|
253
|
-
| `push` | `(content: string, answerType: AnswerType)` | ์ฝํ
์ธ ์ถ๊ฐ ๋ฐ ํ์ดํ ์์
|
|
254
|
-
| `clear` | - | ๋ชจ๋ ์ฝํ
์ธ ๋ฐ ์ํ ์ง์ฐ๊ธฐ
|
|
255
|
-
| `triggerWholeEnd` | - | ์๋์ผ๋ก ์๋ฃ ์ฝ๋ฐฑ ํธ๋ฆฌ๊ฑฐ
|
|
256
|
-
| `
|
|
257
|
-
| `
|
|
319
|
+
| ๋ฉ์๋ | ๋งค๊ฐ๋ณ์ | ์ค๋ช
|
|
|
320
|
+
| ----------------- | ------------------------------------------- | ----------------------------------------------------- |
|
|
321
|
+
| `push` | `(content: string, answerType: AnswerType)` | ์ฝํ
์ธ ์ถ๊ฐ ๋ฐ ํ์ดํ ์์ |
|
|
322
|
+
| `clear` | - | ๋ชจ๋ ์ฝํ
์ธ ๋ฐ ์ํ ์ง์ฐ๊ธฐ |
|
|
323
|
+
| `triggerWholeEnd` | - | ์๋์ผ๋ก ์๋ฃ ์ฝ๋ฐฑ ํธ๋ฆฌ๊ฑฐ |
|
|
324
|
+
| `start` | - | ํ์ดํ ์ ๋๋ฉ์ด์
์์ |
|
|
325
|
+
| `stop` | - | ํ์ดํ ์ผ์์ ์ง |
|
|
326
|
+
| `resume` | - | ํ์ดํ ์ฌ๊ฐ |
|
|
327
|
+
| `restart` | - | ํ์ดํ ์ ๋๋ฉ์ด์
์ฌ์์, ํ์ฌ ์ฝํ
์ธ ๋ฅผ ์ฒ์๋ถํฐ ์ฌ์ |
|
|
258
328
|
|
|
259
329
|
**์ฌ์ฉ ์:**
|
|
260
330
|
|
|
261
331
|
```tsx
|
|
332
|
+
markdownRef.current?.start(); // ์ ๋๋ฉ์ด์
์์
|
|
262
333
|
markdownRef.current?.stop(); // ์ ๋๋ฉ์ด์
์ผ์์ ์ง
|
|
263
334
|
markdownRef.current?.resume(); // ์ ๋๋ฉ์ด์
์ฌ๊ฐ
|
|
335
|
+
markdownRef.current?.restart(); // ์ ๋๋ฉ์ด์
์ฌ์์
|
|
264
336
|
```
|
|
265
337
|
|
|
266
338
|
---
|
|
@@ -586,3 +658,148 @@ import { MarkdownCMDRef } from 'ds-markdown';
|
|
|
586
658
|
const ref = useRef<MarkdownCMDRef>(null);
|
|
587
659
|
// ์์ ํ TypeScript ํ์
ํํธ
|
|
588
660
|
```
|
|
661
|
+
|
|
662
|
+
### ๐ ์ ๋๋ฉ์ด์
์ฌ์์ ๋ฐ๋ชจ
|
|
663
|
+
|
|
664
|
+
```tsx
|
|
665
|
+
import { useRef, useState } from 'react';
|
|
666
|
+
import { MarkdownCMD, MarkdownCMDRef } from 'ds-markdown';
|
|
667
|
+
|
|
668
|
+
function RestartDemo() {
|
|
669
|
+
const markdownRef = useRef<MarkdownCMDRef>(null);
|
|
670
|
+
const [isPlaying, setIsPlaying] = useState(false);
|
|
671
|
+
const [hasStarted, setHasStarted] = useState(false);
|
|
672
|
+
|
|
673
|
+
const startContent = () => {
|
|
674
|
+
markdownRef.current?.clear();
|
|
675
|
+
markdownRef.current?.push(
|
|
676
|
+
'# ์ ๋๋ฉ์ด์
์ฌ์์ ๋ฐ๋ชจ\n\n' +
|
|
677
|
+
'์ด ์์ ๋ `restart()` ๋ฉ์๋์ ์ฌ์ฉ๋ฒ์ ๋ณด์ฌ์ค๋๋ค:\n\n' +
|
|
678
|
+
'- ๐ **์ฌ์์**: ํ์ฌ ์ฝํ
์ธ ๋ฅผ ์ฒ์๋ถํฐ ์ฌ์\n' +
|
|
679
|
+
'- โธ๏ธ **์ผ์์ ์ง/์ฌ๊ฐ**: ์ธ์ ๋ ์ง ์ผ์์ ์ง์ ์ฌ๊ฐ ๊ฐ๋ฅ\n' +
|
|
680
|
+
'- ๐ฏ **์ ๋ฐ ์ ์ด**: ์ ๋๋ฉ์ด์
์ฌ์ ์ํ์ ์์ ํ ์ ์ด\n\n' +
|
|
681
|
+
'ํ์ฌ ์ํ: ' +
|
|
682
|
+
(isPlaying ? '์ฌ์ ์ค' : '์ผ์์ ์ง') +
|
|
683
|
+
'\n\n' +
|
|
684
|
+
'์ด๋ ๋งค์ฐ ์ค์ฉ์ ์ธ ๊ธฐ๋ฅ์
๋๋ค!',
|
|
685
|
+
'answer',
|
|
686
|
+
);
|
|
687
|
+
setIsPlaying(true);
|
|
688
|
+
};
|
|
689
|
+
|
|
690
|
+
const handleStart = () => {
|
|
691
|
+
if (hasStarted) {
|
|
692
|
+
// ์ด๋ฏธ ์์๋ ๊ฒฝ์ฐ ์ฌ์์
|
|
693
|
+
markdownRef.current?.restart();
|
|
694
|
+
} else {
|
|
695
|
+
// ์ฒซ ๋ฒ์งธ ์์
|
|
696
|
+
markdownRef.current?.start();
|
|
697
|
+
setHasStarted(true);
|
|
698
|
+
}
|
|
699
|
+
setIsPlaying(true);
|
|
700
|
+
};
|
|
701
|
+
|
|
702
|
+
const handleStop = () => {
|
|
703
|
+
markdownRef.current?.stop();
|
|
704
|
+
setIsPlaying(false);
|
|
705
|
+
};
|
|
706
|
+
|
|
707
|
+
const handleResume = () => {
|
|
708
|
+
markdownRef.current?.resume();
|
|
709
|
+
setIsPlaying(true);
|
|
710
|
+
};
|
|
711
|
+
|
|
712
|
+
const handleRestart = () => {
|
|
713
|
+
markdownRef.current?.restart();
|
|
714
|
+
setIsPlaying(true);
|
|
715
|
+
};
|
|
716
|
+
|
|
717
|
+
const handleEnd = () => {
|
|
718
|
+
setIsPlaying(false);
|
|
719
|
+
};
|
|
720
|
+
|
|
721
|
+
return (
|
|
722
|
+
<div>
|
|
723
|
+
<div style={{ marginBottom: '10px', display: 'flex', gap: '10px', flexWrap: 'wrap' }}>
|
|
724
|
+
<button onClick={startContent}>๐ ์ฝํ
์ธ ์์</button>
|
|
725
|
+
<button onClick={handleStart} disabled={isPlaying}>
|
|
726
|
+
{hasStarted ? '๐ ์ฌ์์' : 'โถ๏ธ ์์'}
|
|
727
|
+
</button>
|
|
728
|
+
<button onClick={handleStop} disabled={!isPlaying}>
|
|
729
|
+
โธ๏ธ ์ผ์์ ์ง
|
|
730
|
+
</button>
|
|
731
|
+
<button onClick={handleResume} disabled={isPlaying}>
|
|
732
|
+
โถ๏ธ ์ฌ๊ฐ
|
|
733
|
+
</button>
|
|
734
|
+
<button onClick={handleRestart}>๐ ์ฌ์์</button>
|
|
735
|
+
</div>
|
|
736
|
+
|
|
737
|
+
<div style={{ margin: '10px 0', padding: '10px', background: '#f5f5f5', borderRadius: '4px' }}>
|
|
738
|
+
<strong>์ ๋๋ฉ์ด์
์ํ:</strong> {isPlaying ? '๐ข ์ฌ์ ์ค' : '๐ด ์ผ์์ ์ง'}
|
|
739
|
+
</div>
|
|
740
|
+
|
|
741
|
+
<MarkdownCMD ref={markdownRef} interval={25} onEnd={handleEnd} />
|
|
742
|
+
</div>
|
|
743
|
+
);
|
|
744
|
+
}
|
|
745
|
+
```
|
|
746
|
+
|
|
747
|
+
### โถ๏ธ ์๋ ์์ ์ ๋๋ฉ์ด์
๋ฐ๋ชจ
|
|
748
|
+
|
|
749
|
+
```tsx
|
|
750
|
+
import { useRef, useState } from 'react';
|
|
751
|
+
import { MarkdownCMD, MarkdownCMDRef } from 'ds-markdown';
|
|
752
|
+
|
|
753
|
+
function StartDemo() {
|
|
754
|
+
const markdownRef = useRef<MarkdownCMDRef>(null);
|
|
755
|
+
const [isPlaying, setIsPlaying] = useState(false);
|
|
756
|
+
const [hasStarted, setHasStarted] = useState(false);
|
|
757
|
+
|
|
758
|
+
const loadContent = () => {
|
|
759
|
+
markdownRef.current?.clear();
|
|
760
|
+
markdownRef.current?.push(
|
|
761
|
+
'# ์๋ ์์ ์ ๋๋ฉ์ด์
๋ฐ๋ชจ\n\n' +
|
|
762
|
+
'์ด ์์ ๋ `start()` ๋ฉ์๋์ ์ฌ์ฉ๋ฒ์ ๋ณด์ฌ์ค๋๋ค:\n\n' +
|
|
763
|
+
'- ๐ฏ **์๋ ์ ์ด**: `autoStartTyping=false`์ผ ๋ ์๋์ผ๋ก `start()`๋ฅผ ํธ์ถํด์ผ ํฉ๋๋ค\n' +
|
|
764
|
+
'- โฑ๏ธ **์ง์ฐ ์์**: ์ฌ์ฉ์ ์ํธ์์ฉ ํ ์ ๋๋ฉ์ด์
์ ์์ํ ์ ์์ต๋๋ค\n' +
|
|
765
|
+
'- ๐ฎ **๊ฒ์ํ**: ์ฌ์ฉ์์ ์ ๊ทน์ฑ์ด ํ์ํ ์๋๋ฆฌ์ค์ ์ ํฉํฉ๋๋ค\n\n' +
|
|
766
|
+
'"์ ๋๋ฉ์ด์
์์" ๋ฒํผ์ ํด๋ฆญํ์ฌ ํ์ดํ ํจ๊ณผ๋ฅผ ์๋์ผ๋ก ํธ๋ฆฌ๊ฑฐํ์ธ์!',
|
|
767
|
+
'answer',
|
|
768
|
+
);
|
|
769
|
+
setIsPlaying(false);
|
|
770
|
+
};
|
|
771
|
+
|
|
772
|
+
const handleStart = () => {
|
|
773
|
+
if (hasStarted) {
|
|
774
|
+
// ์ด๋ฏธ ์์๋ ๊ฒฝ์ฐ ์ฌ์์
|
|
775
|
+
markdownRef.current?.restart();
|
|
776
|
+
} else {
|
|
777
|
+
// ์ฒซ ๋ฒ์งธ ์์
|
|
778
|
+
markdownRef.current?.start();
|
|
779
|
+
setHasStarted(true);
|
|
780
|
+
}
|
|
781
|
+
setIsPlaying(true);
|
|
782
|
+
};
|
|
783
|
+
|
|
784
|
+
const handleEnd = () => {
|
|
785
|
+
setIsPlaying(false);
|
|
786
|
+
};
|
|
787
|
+
|
|
788
|
+
return (
|
|
789
|
+
<div>
|
|
790
|
+
<div style={{ marginBottom: '10px', display: 'flex', gap: '10px', flexWrap: 'wrap' }}>
|
|
791
|
+
<button onClick={loadContent}>๐ ์ฝํ
์ธ ๋ก๋</button>
|
|
792
|
+
<button onClick={handleStart} disabled={isPlaying}>
|
|
793
|
+
{hasStarted ? '๐ ์ฌ์์' : 'โถ๏ธ ์ ๋๋ฉ์ด์
์์'}
|
|
794
|
+
</button>
|
|
795
|
+
</div>
|
|
796
|
+
|
|
797
|
+
<div style={{ margin: '10px 0', padding: '10px', background: '#f5f5f5', borderRadius: '4px' }}>
|
|
798
|
+
<strong>์ํ:</strong> {isPlaying ? '๐ข ์ ๋๋ฉ์ด์
์ฌ์ ์ค' : '๐ด ์์ ๋๊ธฐ ์ค'}
|
|
799
|
+
</div>
|
|
800
|
+
|
|
801
|
+
<MarkdownCMD ref={markdownRef} interval={30} autoStartTyping={false} onEnd={handleEnd} />
|
|
802
|
+
</div>
|
|
803
|
+
);
|
|
804
|
+
}
|
|
805
|
+
```
|