@superlc/md-core 0.1.0

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.
Files changed (40) hide show
  1. package/dist/index.cjs +300 -0
  2. package/dist/index.d.ts +16 -0
  3. package/dist/index.d.ts.map +1 -0
  4. package/dist/index.js +14818 -0
  5. package/dist/inline-prediction/completer.d.ts +49 -0
  6. package/dist/inline-prediction/completer.d.ts.map +1 -0
  7. package/dist/inline-prediction/index.d.ts +3 -0
  8. package/dist/inline-prediction/index.d.ts.map +1 -0
  9. package/dist/inline-prediction/types.d.ts +51 -0
  10. package/dist/inline-prediction/types.d.ts.map +1 -0
  11. package/dist/output-rate/controller.d.ts +75 -0
  12. package/dist/output-rate/controller.d.ts.map +1 -0
  13. package/dist/output-rate/index.d.ts +4 -0
  14. package/dist/output-rate/index.d.ts.map +1 -0
  15. package/dist/output-rate/types.d.ts +30 -0
  16. package/dist/output-rate/types.d.ts.map +1 -0
  17. package/dist/parse.d.ts +42 -0
  18. package/dist/parse.d.ts.map +1 -0
  19. package/dist/plugins/index.d.ts +5 -0
  20. package/dist/plugins/index.d.ts.map +1 -0
  21. package/dist/plugins/rehype-image-size.d.ts +9 -0
  22. package/dist/plugins/rehype-image-size.d.ts.map +1 -0
  23. package/dist/processor.d.ts +20 -0
  24. package/dist/processor.d.ts.map +1 -0
  25. package/dist/streaming/block-cache.d.ts +53 -0
  26. package/dist/streaming/block-cache.d.ts.map +1 -0
  27. package/dist/streaming/block-splitter.d.ts +39 -0
  28. package/dist/streaming/block-splitter.d.ts.map +1 -0
  29. package/dist/streaming/index.d.ts +10 -0
  30. package/dist/streaming/index.d.ts.map +1 -0
  31. package/dist/streaming/stream-buffer.d.ts +61 -0
  32. package/dist/streaming/stream-buffer.d.ts.map +1 -0
  33. package/dist/streaming/streaming-parser.d.ts +7 -0
  34. package/dist/streaming/streaming-parser.d.ts.map +1 -0
  35. package/dist/streaming/types.d.ts +104 -0
  36. package/dist/streaming/types.d.ts.map +1 -0
  37. package/dist/styles.css +522 -0
  38. package/dist/types.d.ts +32 -0
  39. package/dist/types.d.ts.map +1 -0
  40. package/package.json +60 -0
@@ -0,0 +1,522 @@
1
+ /**
2
+ * @tc/md-core 默认样式
3
+ *
4
+ * 使用方法:
5
+ * import '@tc/md-core/styles.css';
6
+ * <div class="markdown-body">...</div>
7
+ *
8
+ * 定制主题:
9
+ * :root { --md-color-primary: red; }
10
+ *
11
+ * 强制暗黑/浅色:
12
+ * <div class="markdown-body md-dark">...</div>
13
+ */
14
+
15
+ /* ========================================
16
+ CSS 变量定义 - 浅色模式(默认)
17
+ ======================================== */
18
+ :root,
19
+ .md-light {
20
+ /* 基础颜色 */
21
+ --md-color-text: #24292f;
22
+ --md-color-text-muted: #656d76;
23
+ --md-color-primary: #0969da;
24
+ --md-color-bg: #ffffff;
25
+ --md-color-border: #d0d7de;
26
+
27
+ /* 代码 */
28
+ --md-color-bg-muted: rgba(175, 184, 193, 0.2);
29
+ --md-color-bg-code-block: #f6f8fa;
30
+
31
+ /* 表格 */
32
+ --md-color-bg-table-header: rgba(175, 184, 193, 0.2);
33
+ --md-color-bg-table-row: rgba(234, 238, 242, 0.5);
34
+
35
+ /* 引用 */
36
+ --md-color-blockquote-border: rgba(175, 184, 193, 0.4);
37
+
38
+ /* 字体 */
39
+ --md-font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', 'Noto Sans', Helvetica, Arial, sans-serif;
40
+ --md-font-family-mono: ui-monospace, SFMono-Regular, 'SF Mono', Menlo, Consolas, 'Liberation Mono', monospace;
41
+ --md-font-size-base: 14px;
42
+ --md-line-height: 1.5;
43
+
44
+ /* 圆角 */
45
+ --md-radius: 6px;
46
+ --md-radius-sm: 4px;
47
+
48
+ /* 图片骨架屏 */
49
+ --md-skeleton-bg: #e8e8e8;
50
+ --md-skeleton-shine: #f5f5f5;
51
+ --md-skeleton-icon: #bdbdbd;
52
+ --md-skeleton-icon-detail: #9e9e9e;
53
+
54
+ /* 代码高亮 - 浅色 */
55
+ --md-hljs-bg: #f6f8fa;
56
+ --md-hljs-text: #24292f;
57
+ --md-hljs-keyword: #cf222e;
58
+ --md-hljs-string: #0a3069;
59
+ --md-hljs-comment: #6e7781;
60
+ --md-hljs-function: #8250df;
61
+ --md-hljs-number: #0550ae;
62
+
63
+ /* Pending 状态 */
64
+ --md-pending-border-color: #0969da;
65
+ }
66
+
67
+ /* ========================================
68
+ 暗黑模式 - 系统偏好
69
+ ======================================== */
70
+ @media (prefers-color-scheme: dark) {
71
+ :root:not(.md-light) {
72
+ --md-color-text: #e6edf3;
73
+ --md-color-text-muted: #8b949e;
74
+ --md-color-primary: #4493f8;
75
+ --md-color-bg: #0d1117;
76
+ --md-color-border: #30363d;
77
+
78
+ --md-color-bg-muted: rgba(110, 118, 129, 0.4);
79
+ --md-color-bg-code-block: #161b22;
80
+
81
+ --md-color-bg-table-header: rgba(110, 118, 129, 0.4);
82
+ --md-color-bg-table-row: rgba(110, 118, 129, 0.1);
83
+
84
+ --md-color-blockquote-border: rgba(110, 118, 129, 0.4);
85
+
86
+ --md-skeleton-bg: #21262d;
87
+ --md-skeleton-shine: #30363d;
88
+ --md-skeleton-icon: #484f58;
89
+ --md-skeleton-icon-detail: #6e7681;
90
+
91
+ --md-hljs-bg: #161b22;
92
+ --md-hljs-text: #e6edf3;
93
+ --md-hljs-keyword: #ff7b72;
94
+ --md-hljs-string: #a5d6ff;
95
+ --md-hljs-comment: #8b949e;
96
+ --md-hljs-function: #d2a8ff;
97
+ --md-hljs-number: #79c0ff;
98
+
99
+ --md-pending-border-color: #4493f8;
100
+ }
101
+ }
102
+
103
+ /* ========================================
104
+ 暗黑模式 - 手动强制(优先级最高)
105
+ ======================================== */
106
+ .md-dark {
107
+ --md-color-text: #e6edf3;
108
+ --md-color-text-muted: #8b949e;
109
+ --md-color-primary: #4493f8;
110
+ --md-color-bg: #0d1117;
111
+ --md-color-border: #30363d;
112
+
113
+ --md-color-bg-muted: rgba(110, 118, 129, 0.4);
114
+ --md-color-bg-code-block: #161b22;
115
+
116
+ --md-color-bg-table-header: rgba(110, 118, 129, 0.4);
117
+ --md-color-bg-table-row: rgba(110, 118, 129, 0.1);
118
+
119
+ --md-color-blockquote-border: rgba(110, 118, 129, 0.4);
120
+
121
+ --md-skeleton-bg: #21262d;
122
+ --md-skeleton-shine: #30363d;
123
+ --md-skeleton-icon: #484f58;
124
+ --md-skeleton-icon-detail: #6e7681;
125
+
126
+ --md-hljs-bg: #161b22;
127
+ --md-hljs-text: #e6edf3;
128
+ --md-hljs-keyword: #ff7b72;
129
+ --md-hljs-string: #a5d6ff;
130
+ --md-hljs-comment: #8b949e;
131
+ --md-hljs-function: #d2a8ff;
132
+ --md-hljs-number: #79c0ff;
133
+
134
+ --md-pending-border-color: #4493f8;
135
+ }
136
+
137
+ /* ========================================
138
+ Markdown 容器
139
+ ======================================== */
140
+ .markdown-body {
141
+ font-family: var(--md-font-family);
142
+ font-size: var(--md-font-size-base);
143
+ line-height: var(--md-line-height);
144
+ color: var(--md-color-text);
145
+ background-color: var(--md-color-bg);
146
+ word-wrap: break-word;
147
+ }
148
+
149
+ /* 子元素间距 */
150
+ .markdown-body>*+* {
151
+ margin-top: 1rem;
152
+ }
153
+
154
+ /* 首个子元素无顶部 margin */
155
+ .markdown-body>*:first-child {
156
+ margin-top: 0;
157
+ }
158
+
159
+ /* 最后子元素无底部 margin */
160
+ .markdown-body>*:last-child {
161
+ margin-bottom: 0;
162
+ }
163
+
164
+ /* ========================================
165
+ 标题
166
+ ======================================== */
167
+ .markdown-body h1,
168
+ .markdown-body h2,
169
+ .markdown-body h3,
170
+ .markdown-body h4,
171
+ .markdown-body h5,
172
+ .markdown-body h6 {
173
+ margin-top: 1.5rem;
174
+ margin-bottom: 0.5rem;
175
+ font-weight: 600;
176
+ line-height: 1.25;
177
+ color: var(--md-color-text);
178
+ }
179
+
180
+ /* h1: 1.875rem (30px) */
181
+ .markdown-body h1 {
182
+ font-size: 1.875rem;
183
+ }
184
+
185
+ /* h2: 1.5rem (24px) */
186
+ .markdown-body h2 {
187
+ font-size: 1.5rem;
188
+ }
189
+
190
+ /* h3: 1.25rem (20px) */
191
+ .markdown-body h3 {
192
+ font-size: 1.25rem;
193
+ }
194
+
195
+ /* h4: 1.125rem (18px) */
196
+ .markdown-body h4 {
197
+ font-size: 1.125rem;
198
+ }
199
+
200
+ /* h5: 1rem (16px) */
201
+ .markdown-body h5 {
202
+ font-size: 1rem;
203
+ }
204
+
205
+ /* h6: 0.875rem (14px) */
206
+ .markdown-body h6 {
207
+ font-size: 0.875rem;
208
+ }
209
+
210
+ /* ========================================
211
+ 段落
212
+ ======================================== */
213
+ .markdown-body p {
214
+ margin-top: 0;
215
+ margin-bottom: 0;
216
+ }
217
+
218
+ /* ========================================
219
+ 链接
220
+ ======================================== */
221
+ .markdown-body a {
222
+ color: var(--md-color-primary);
223
+ text-decoration: underline;
224
+ overflow-wrap: anywhere;
225
+ }
226
+
227
+ .markdown-body a:hover {
228
+ opacity: 0.8;
229
+ }
230
+
231
+ /* ========================================
232
+ 粗体
233
+ ======================================== */
234
+ .markdown-body strong {
235
+ font-weight: 600;
236
+ }
237
+
238
+ /* ========================================
239
+ 行内代码
240
+ ======================================== */
241
+ .markdown-body code {
242
+ background-color: var(--md-color-bg-muted);
243
+ border-radius: var(--md-radius-sm);
244
+ padding: 0.125rem 0.375rem;
245
+ font-size: 0.875rem;
246
+ font-family: var(--md-font-family-mono);
247
+ }
248
+
249
+ /* ========================================
250
+ 代码块
251
+ ======================================== */
252
+ .markdown-body pre {
253
+ margin-top: 0;
254
+ margin-bottom: 0;
255
+ background-color: var(--md-color-bg-code-block);
256
+ border-radius: var(--md-radius);
257
+ padding: 1rem;
258
+ overflow-x: auto;
259
+ }
260
+
261
+ .markdown-body pre code {
262
+ background: transparent;
263
+ padding: 0;
264
+ font-size: 0.875rem;
265
+ border-radius: 0;
266
+ line-height: 1.45;
267
+ }
268
+
269
+ /* ========================================
270
+ 引用块
271
+ ======================================== */
272
+ .markdown-body blockquote {
273
+ margin: 1rem 0;
274
+ padding: 0 0 0 1rem;
275
+ color: var(--md-color-text-muted);
276
+ border-left: 4px solid var(--md-color-blockquote-border);
277
+ }
278
+
279
+ .markdown-body blockquote>*:first-child {
280
+ margin-top: 0;
281
+ }
282
+
283
+ .markdown-body blockquote>*:last-child {
284
+ margin-bottom: 0;
285
+ }
286
+
287
+ /* ========================================
288
+ 列表
289
+ ======================================== */
290
+ .markdown-body ul,
291
+ .markdown-body ol {
292
+ margin-top: 0;
293
+ margin-bottom: 0;
294
+ padding-left: 0;
295
+ list-style-position: inside;
296
+ white-space: normal;
297
+ }
298
+
299
+ .markdown-body ul {
300
+ list-style-type: disc;
301
+ }
302
+
303
+ .markdown-body ol {
304
+ list-style-type: decimal;
305
+ }
306
+
307
+ /* 嵌套列表缩进 */
308
+ .markdown-body li ul,
309
+ .markdown-body li ol {
310
+ padding-left: 1.5rem;
311
+ }
312
+
313
+ /* 列表项 */
314
+ .markdown-body li {
315
+ padding-top: 0.25rem;
316
+ padding-bottom: 0.25rem;
317
+ }
318
+
319
+ /* 列表项内段落内联 */
320
+ .markdown-body li>p {
321
+ display: inline;
322
+ }
323
+
324
+ /* ========================================
325
+ 表格
326
+ ======================================== */
327
+ .markdown-body table {
328
+ border-collapse: collapse;
329
+ width: 100%;
330
+ margin: 0;
331
+ border: 1px solid var(--md-color-border);
332
+ border-radius: var(--md-radius);
333
+ overflow: hidden;
334
+ }
335
+
336
+ .markdown-body thead {
337
+ background-color: var(--md-color-bg-table-header);
338
+ }
339
+
340
+ .markdown-body tbody {
341
+ background-color: var(--md-color-bg-table-row);
342
+ }
343
+
344
+ .markdown-body tr {
345
+ border-bottom: 1px solid var(--md-color-border);
346
+ }
347
+
348
+ .markdown-body tr:last-child {
349
+ border-bottom: none;
350
+ }
351
+
352
+ .markdown-body th {
353
+ padding: 0.5rem 1rem;
354
+ text-align: left;
355
+ font-weight: 600;
356
+ font-size: 0.875rem;
357
+ white-space: nowrap;
358
+ border: none;
359
+ }
360
+
361
+ .markdown-body td {
362
+ padding: 0.5rem 1rem;
363
+ font-size: 0.875rem;
364
+ border: none;
365
+ }
366
+
367
+ /* ========================================
368
+ 分割线
369
+ ======================================== */
370
+ .markdown-body hr {
371
+ border: 0;
372
+ border-top: 1px solid var(--md-color-border);
373
+ margin: 1.5rem 0;
374
+ }
375
+
376
+ /* ========================================
377
+ 图片
378
+ ======================================== */
379
+ .markdown-body img {
380
+ max-width: 100%;
381
+ height: auto;
382
+ border-radius: var(--md-radius);
383
+ }
384
+
385
+ /* ========================================
386
+ 删除线
387
+ ======================================== */
388
+ .markdown-body del {
389
+ color: var(--md-color-text-muted);
390
+ text-decoration: line-through;
391
+ }
392
+
393
+ /* ========================================
394
+ 上标/下标
395
+ ======================================== */
396
+ .markdown-body sup,
397
+ .markdown-body sub {
398
+ font-size: 0.875rem;
399
+ }
400
+
401
+ /* ========================================
402
+ 代码高亮 (highlight.js)
403
+ ======================================== */
404
+ .markdown-body .hljs {
405
+ background: var(--md-hljs-bg);
406
+ color: var(--md-hljs-text);
407
+ }
408
+
409
+ .markdown-body .hljs-keyword,
410
+ .markdown-body .hljs-selector-tag {
411
+ color: var(--md-hljs-keyword);
412
+ }
413
+
414
+ .markdown-body .hljs-string,
415
+ .markdown-body .hljs-attr {
416
+ color: var(--md-hljs-string);
417
+ }
418
+
419
+ .markdown-body .hljs-comment {
420
+ color: var(--md-hljs-comment);
421
+ }
422
+
423
+ .markdown-body .hljs-function,
424
+ .markdown-body .hljs-title {
425
+ color: var(--md-hljs-function);
426
+ }
427
+
428
+ .markdown-body .hljs-number {
429
+ color: var(--md-hljs-number);
430
+ }
431
+
432
+ /* ========================================
433
+ 流式渲染 - Pending 状态
434
+ ======================================== */
435
+ .markdown-body [data-pending="true"] {
436
+ position: relative;
437
+ }
438
+
439
+ .markdown-body [data-pending="true"]::after {
440
+ display: none;
441
+ }
442
+
443
+ .markdown-body pre[data-pending="true"]::after {
444
+ display: none;
445
+ }
446
+
447
+ /* ========================================
448
+ 流式渲染 - 图片骨架屏
449
+ ======================================== */
450
+ @keyframes md-image-shimmer {
451
+ 0% {
452
+ background-position: -200% 0;
453
+ }
454
+
455
+ 100% {
456
+ background-position: 200% 0;
457
+ }
458
+ }
459
+
460
+ .md-image-container {
461
+ position: relative;
462
+ display: block;
463
+ border-radius: var(--md-radius);
464
+ overflow: hidden;
465
+ }
466
+
467
+ .md-image {
468
+ display: block;
469
+ width: 100%;
470
+ height: 100%;
471
+ object-fit: cover;
472
+ }
473
+
474
+ .md-image-skeleton {
475
+ position: absolute;
476
+ top: 0;
477
+ left: 0;
478
+ width: 100%;
479
+ height: 100%;
480
+ background-color: var(--md-skeleton-bg);
481
+ background-image: linear-gradient(90deg, var(--md-skeleton-bg) 0%, var(--md-skeleton-shine) 50%, var(--md-skeleton-bg) 100%);
482
+ background-size: 200% 100%;
483
+ animation: md-image-shimmer 1.5s linear infinite;
484
+ display: flex;
485
+ align-items: center;
486
+ justify-content: center;
487
+ border-radius: var(--md-radius);
488
+ z-index: 1;
489
+ pointer-events: none;
490
+ }
491
+
492
+ .md-image-skeleton-icon {
493
+ fill: var(--md-skeleton-icon);
494
+ }
495
+
496
+ .md-image-skeleton-icon-detail {
497
+ fill: var(--md-skeleton-icon-detail);
498
+ }
499
+
500
+ /* ========================================
501
+ 流式渲染 - 文本淡入动画
502
+ ======================================== */
503
+ @keyframes md-fade-in {
504
+ from {
505
+ opacity: 0;
506
+ }
507
+
508
+ to {
509
+ opacity: 1;
510
+ }
511
+ }
512
+
513
+ .md-animation-text {
514
+ color: inherit;
515
+ }
516
+
517
+ /* ========================================
518
+ KaTeX 错误样式覆盖
519
+ ======================================== */
520
+ .katex-error {
521
+ color: inherit !important;
522
+ }
@@ -0,0 +1,32 @@
1
+ import { Pluggable } from 'unified';
2
+
3
+ /**
4
+ * 插件配置
5
+ */
6
+ export interface PluginConfig {
7
+ plugin: Pluggable;
8
+ options?: unknown;
9
+ }
10
+ /**
11
+ * Processor 配置选项
12
+ */
13
+ export interface ProcessorOptions {
14
+ /** 启用 GFM(GitHub Flavored Markdown)扩展,默认 true */
15
+ gfm?: boolean;
16
+ /** 启用代码高亮,默认 true */
17
+ highlight?: boolean;
18
+ /** 启用数学公式渲染(LaTeX 语法),默认 false */
19
+ math?: boolean;
20
+ /** 自定义 remark 插件 */
21
+ remarkPlugins?: PluginConfig[];
22
+ /** 自定义 rehype 插件 */
23
+ rehypePlugins?: PluginConfig[];
24
+ }
25
+ /**
26
+ * 解析配置选项
27
+ */
28
+ export interface ParseOptions extends ProcessorOptions {
29
+ /** Markdown 源文本 */
30
+ content: string;
31
+ }
32
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,SAAS,CAAC;AAEzC;;GAEG;AACH,MAAM,WAAW,YAAY;IAC3B,MAAM,EAAE,SAAS,CAAC;IAClB,OAAO,CAAC,EAAE,OAAO,CAAC;CACnB;AAED;;GAEG;AACH,MAAM,WAAW,gBAAgB;IAC/B,iDAAiD;IACjD,GAAG,CAAC,EAAE,OAAO,CAAC;IACd,qBAAqB;IACrB,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,kCAAkC;IAClC,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,oBAAoB;IACpB,aAAa,CAAC,EAAE,YAAY,EAAE,CAAC;IAC/B,oBAAoB;IACpB,aAAa,CAAC,EAAE,YAAY,EAAE,CAAC;CAChC;AAED;;GAEG;AACH,MAAM,WAAW,YAAa,SAAQ,gBAAgB;IACpD,mBAAmB;IACnB,OAAO,EAAE,MAAM,CAAC;CACjB"}
package/package.json ADDED
@@ -0,0 +1,60 @@
1
+ {
2
+ "name": "@superlc/md-core",
3
+ "version": "0.1.0",
4
+ "description": "基于 unified 的 Markdown 解析核心库",
5
+ "type": "module",
6
+ "main": "./dist/index.cjs",
7
+ "module": "./dist/index.js",
8
+ "types": "./dist/index.d.ts",
9
+ "exports": {
10
+ ".": {
11
+ "import": "./dist/index.js",
12
+ "require": "./dist/index.cjs",
13
+ "types": "./dist/index.d.ts"
14
+ },
15
+ "./styles.css": "./dist/styles.css"
16
+ },
17
+ "files": [
18
+ "dist"
19
+ ],
20
+ "scripts": {
21
+ "build": "vite build",
22
+ "dev": "vite build --watch",
23
+ "test": "vitest",
24
+ "test:run": "vitest run"
25
+ },
26
+ "dependencies": {
27
+ "@types/hast": "^3.0.0",
28
+ "@types/mdast": "^4.0.0",
29
+ "hast-util-to-jsx-runtime": "^2.3.0",
30
+ "rehype-highlight": "^7.0.0",
31
+ "rehype-katex": "^7.0.1",
32
+ "rehype-stringify": "^10.0.0",
33
+ "remark-gfm": "^4.0.0",
34
+ "remark-math": "^6.0.0",
35
+ "remark-parse": "^11.0.0",
36
+ "remark-rehype": "^11.0.0",
37
+ "unified": "^11.0.0",
38
+ "unist-util-visit": "^5.0.0"
39
+ },
40
+ "peerDependencies": {
41
+ "react": ">=18.0.0",
42
+ "vue": ">=3.0.0"
43
+ },
44
+ "peerDependenciesMeta": {
45
+ "react": {
46
+ "optional": true
47
+ },
48
+ "vue": {
49
+ "optional": true
50
+ }
51
+ },
52
+ "keywords": [
53
+ "markdown",
54
+ "unified",
55
+ "remark",
56
+ "rehype",
57
+ "parser"
58
+ ],
59
+ "license": "MIT"
60
+ }