@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.
- package/dist/index.cjs +300 -0
- package/dist/index.d.ts +16 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +14818 -0
- package/dist/inline-prediction/completer.d.ts +49 -0
- package/dist/inline-prediction/completer.d.ts.map +1 -0
- package/dist/inline-prediction/index.d.ts +3 -0
- package/dist/inline-prediction/index.d.ts.map +1 -0
- package/dist/inline-prediction/types.d.ts +51 -0
- package/dist/inline-prediction/types.d.ts.map +1 -0
- package/dist/output-rate/controller.d.ts +75 -0
- package/dist/output-rate/controller.d.ts.map +1 -0
- package/dist/output-rate/index.d.ts +4 -0
- package/dist/output-rate/index.d.ts.map +1 -0
- package/dist/output-rate/types.d.ts +30 -0
- package/dist/output-rate/types.d.ts.map +1 -0
- package/dist/parse.d.ts +42 -0
- package/dist/parse.d.ts.map +1 -0
- package/dist/plugins/index.d.ts +5 -0
- package/dist/plugins/index.d.ts.map +1 -0
- package/dist/plugins/rehype-image-size.d.ts +9 -0
- package/dist/plugins/rehype-image-size.d.ts.map +1 -0
- package/dist/processor.d.ts +20 -0
- package/dist/processor.d.ts.map +1 -0
- package/dist/streaming/block-cache.d.ts +53 -0
- package/dist/streaming/block-cache.d.ts.map +1 -0
- package/dist/streaming/block-splitter.d.ts +39 -0
- package/dist/streaming/block-splitter.d.ts.map +1 -0
- package/dist/streaming/index.d.ts +10 -0
- package/dist/streaming/index.d.ts.map +1 -0
- package/dist/streaming/stream-buffer.d.ts +61 -0
- package/dist/streaming/stream-buffer.d.ts.map +1 -0
- package/dist/streaming/streaming-parser.d.ts +7 -0
- package/dist/streaming/streaming-parser.d.ts.map +1 -0
- package/dist/streaming/types.d.ts +104 -0
- package/dist/streaming/types.d.ts.map +1 -0
- package/dist/styles.css +522 -0
- package/dist/types.d.ts +32 -0
- package/dist/types.d.ts.map +1 -0
- package/package.json +60 -0
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
import { InlineType, CompletionResult, InlinePredictionOptions } from './types';
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* 默认启用的行内标记类型
|
|
5
|
+
*/
|
|
6
|
+
export declare const DEFAULT_INLINE_TYPES: InlineType[];
|
|
7
|
+
/**
|
|
8
|
+
* 行内标记预测补全器
|
|
9
|
+
* 检测未闭合的行内标记并智能补全
|
|
10
|
+
*/
|
|
11
|
+
export declare class InlineCompleter {
|
|
12
|
+
private enabledTypes;
|
|
13
|
+
constructor(options?: InlinePredictionOptions);
|
|
14
|
+
/**
|
|
15
|
+
* 补全未闭合的行内标记
|
|
16
|
+
*/
|
|
17
|
+
complete(text: string): CompletionResult;
|
|
18
|
+
/**
|
|
19
|
+
* 处理行内代码标记
|
|
20
|
+
*/
|
|
21
|
+
private handleCodeMarker;
|
|
22
|
+
/**
|
|
23
|
+
* 处理双字符标记(**, __, ~~)
|
|
24
|
+
*/
|
|
25
|
+
private handleDoubleMarker;
|
|
26
|
+
/**
|
|
27
|
+
* 处理单字符强调标记(* 或 _)
|
|
28
|
+
*/
|
|
29
|
+
private handleSingleEmphasis;
|
|
30
|
+
/**
|
|
31
|
+
* 处理链接或图片标记
|
|
32
|
+
*/
|
|
33
|
+
private handleImageOrLink;
|
|
34
|
+
/**
|
|
35
|
+
* 在栈中查找匹配的标记
|
|
36
|
+
*/
|
|
37
|
+
private findInStack;
|
|
38
|
+
/**
|
|
39
|
+
* 获取闭合标记
|
|
40
|
+
* - 链接补全为 ](#),形成可点击但无实际跳转的链接
|
|
41
|
+
* - 图片补全使用占位图 URL
|
|
42
|
+
*/
|
|
43
|
+
private getCloseMarker;
|
|
44
|
+
/**
|
|
45
|
+
* 更新启用的类型
|
|
46
|
+
*/
|
|
47
|
+
setEnabledTypes(types: InlineType[]): void;
|
|
48
|
+
}
|
|
49
|
+
//# sourceMappingURL=completer.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"completer.d.ts","sourceRoot":"","sources":["../../src/inline-prediction/completer.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,UAAU,EAEV,gBAAgB,EAChB,uBAAuB,EAExB,MAAM,SAAS,CAAC;AA+BjB;;GAEG;AACH,eAAO,MAAM,oBAAoB,EAAE,UAAU,EAO5C,CAAC;AAEF;;;GAGG;AACH,qBAAa,eAAe;IAC1B,OAAO,CAAC,YAAY,CAAkB;gBAE1B,OAAO,GAAE,uBAA4B;IAKjD;;OAEG;IACH,QAAQ,CAAC,IAAI,EAAE,MAAM,GAAG,gBAAgB;IA2IxC;;OAEG;IACH,OAAO,CAAC,gBAAgB;IAyBxB;;OAEG;IACH,OAAO,CAAC,kBAAkB;IAwB1B;;OAEG;IACH,OAAO,CAAC,oBAAoB;IAsC5B;;OAEG;IACH,OAAO,CAAC,iBAAiB;IA+DzB;;OAEG;IACH,OAAO,CAAC,WAAW;IAiBnB;;;;OAIG;IACH,OAAO,CAAC,cAAc;IAyCtB;;OAEG;IACH,eAAe,CAAC,KAAK,EAAE,UAAU,EAAE,GAAG,IAAI;CAG3C"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/inline-prediction/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,oBAAoB,EAAE,MAAM,aAAa,CAAC;AACpE,YAAY,EACV,UAAU,EACV,UAAU,EACV,gBAAgB,EAChB,uBAAuB,GACxB,MAAM,SAAS,CAAC"}
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* 行内预测补全类型
|
|
3
|
+
*/
|
|
4
|
+
/**
|
|
5
|
+
* 支持的行内标记类型
|
|
6
|
+
*/
|
|
7
|
+
export type InlineType = 'bold' | 'italic' | 'code' | 'strikethrough' | 'link' | 'image';
|
|
8
|
+
/**
|
|
9
|
+
* 补全信息
|
|
10
|
+
*/
|
|
11
|
+
export interface Completion {
|
|
12
|
+
/** 标记类型 */
|
|
13
|
+
type: InlineType;
|
|
14
|
+
/** 开始标记在原文中的位置 */
|
|
15
|
+
position: number;
|
|
16
|
+
/** 补全的闭合标记 */
|
|
17
|
+
marker: string;
|
|
18
|
+
/** 开始标记 */
|
|
19
|
+
openMarker: string;
|
|
20
|
+
}
|
|
21
|
+
/**
|
|
22
|
+
* 补全结果
|
|
23
|
+
*/
|
|
24
|
+
export interface CompletionResult {
|
|
25
|
+
/** 补全后的文本 */
|
|
26
|
+
text: string;
|
|
27
|
+
/** 补全的标记信息 */
|
|
28
|
+
completions: Completion[];
|
|
29
|
+
/** 是否有补全 */
|
|
30
|
+
hasCompletions: boolean;
|
|
31
|
+
}
|
|
32
|
+
/**
|
|
33
|
+
* 行内预测配置
|
|
34
|
+
*/
|
|
35
|
+
export interface InlinePredictionOptions {
|
|
36
|
+
/** 是否启用行内预测,默认 true */
|
|
37
|
+
enableInlinePrediction?: boolean;
|
|
38
|
+
/** 预测的行内标记类型,默认全部 */
|
|
39
|
+
predictedInlineTypes?: InlineType[];
|
|
40
|
+
}
|
|
41
|
+
/**
|
|
42
|
+
* 标记状态(用于栈追踪)
|
|
43
|
+
*/
|
|
44
|
+
export interface MarkerState {
|
|
45
|
+
type: InlineType;
|
|
46
|
+
marker: string;
|
|
47
|
+
position: number;
|
|
48
|
+
/** 对于图片,记录 ]( 后 URL 开始的位置,用于替换不完整的 URL */
|
|
49
|
+
urlStartPosition?: number;
|
|
50
|
+
}
|
|
51
|
+
//# sourceMappingURL=types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/inline-prediction/types.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH;;GAEG;AACH,MAAM,MAAM,UAAU,GAAG,MAAM,GAAG,QAAQ,GAAG,MAAM,GAAG,eAAe,GAAG,MAAM,GAAG,OAAO,CAAC;AAEzF;;GAEG;AACH,MAAM,WAAW,UAAU;IACzB,WAAW;IACX,IAAI,EAAE,UAAU,CAAC;IACjB,kBAAkB;IAClB,QAAQ,EAAE,MAAM,CAAC;IACjB,cAAc;IACd,MAAM,EAAE,MAAM,CAAC;IACf,WAAW;IACX,UAAU,EAAE,MAAM,CAAC;CACpB;AAED;;GAEG;AACH,MAAM,WAAW,gBAAgB;IAC/B,aAAa;IACb,IAAI,EAAE,MAAM,CAAC;IACb,cAAc;IACd,WAAW,EAAE,UAAU,EAAE,CAAC;IAC1B,YAAY;IACZ,cAAc,EAAE,OAAO,CAAC;CACzB;AAED;;GAEG;AACH,MAAM,WAAW,uBAAuB;IACtC,uBAAuB;IACvB,sBAAsB,CAAC,EAAE,OAAO,CAAC;IACjC,qBAAqB;IACrB,oBAAoB,CAAC,EAAE,UAAU,EAAE,CAAC;CACrC;AAED;;GAEG;AACH,MAAM,WAAW,WAAW;IAC1B,IAAI,EAAE,UAAU,CAAC;IACjB,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,EAAE,MAAM,CAAC;IACjB,0CAA0C;IAC1C,gBAAgB,CAAC,EAAE,MAAM,CAAC;CAC3B"}
|
|
@@ -0,0 +1,75 @@
|
|
|
1
|
+
import { OutputRate, OutputRateStatus } from './types';
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* 输出速率控制器
|
|
5
|
+
* 用于控制流式内容的输出速率
|
|
6
|
+
*/
|
|
7
|
+
export declare class OutputRateController {
|
|
8
|
+
private _status;
|
|
9
|
+
private _progress;
|
|
10
|
+
private _config;
|
|
11
|
+
private _content;
|
|
12
|
+
private _index;
|
|
13
|
+
private _accumulated;
|
|
14
|
+
private _timerId;
|
|
15
|
+
private _onChunk;
|
|
16
|
+
private _onComplete;
|
|
17
|
+
constructor(rate?: OutputRate);
|
|
18
|
+
/**
|
|
19
|
+
* 当前状态
|
|
20
|
+
*/
|
|
21
|
+
get status(): OutputRateStatus;
|
|
22
|
+
/**
|
|
23
|
+
* 输出进度 (0-1)
|
|
24
|
+
*/
|
|
25
|
+
get progress(): number;
|
|
26
|
+
/**
|
|
27
|
+
* 开始按速率输出内容
|
|
28
|
+
*/
|
|
29
|
+
start(content: string, onChunk: (chunk: string, accumulated: string) => void, onComplete?: () => void): void;
|
|
30
|
+
/**
|
|
31
|
+
* 暂停输出
|
|
32
|
+
*/
|
|
33
|
+
pause(): void;
|
|
34
|
+
/**
|
|
35
|
+
* 恢复输出
|
|
36
|
+
*/
|
|
37
|
+
resume(): void;
|
|
38
|
+
/**
|
|
39
|
+
* 停止并重置
|
|
40
|
+
*/
|
|
41
|
+
stop(): void;
|
|
42
|
+
/**
|
|
43
|
+
* 跳过剩余内容,立即完成
|
|
44
|
+
*/
|
|
45
|
+
skipToEnd(): void;
|
|
46
|
+
/**
|
|
47
|
+
* 更新速率(运行时)
|
|
48
|
+
*/
|
|
49
|
+
setRate(rate: OutputRate): void;
|
|
50
|
+
/**
|
|
51
|
+
* 解析速率配置
|
|
52
|
+
*/
|
|
53
|
+
private _resolveConfig;
|
|
54
|
+
/**
|
|
55
|
+
* 调度下一次输出
|
|
56
|
+
*/
|
|
57
|
+
private _scheduleNext;
|
|
58
|
+
/**
|
|
59
|
+
* 输出一个 chunk
|
|
60
|
+
*/
|
|
61
|
+
private _outputChunk;
|
|
62
|
+
/**
|
|
63
|
+
* 立即输出全部内容
|
|
64
|
+
*/
|
|
65
|
+
private _outputAll;
|
|
66
|
+
/**
|
|
67
|
+
* 完成输出
|
|
68
|
+
*/
|
|
69
|
+
private _complete;
|
|
70
|
+
/**
|
|
71
|
+
* 清除定时器
|
|
72
|
+
*/
|
|
73
|
+
private _clearTimer;
|
|
74
|
+
}
|
|
75
|
+
//# sourceMappingURL=controller.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"controller.d.ts","sourceRoot":"","sources":["../../src/output-rate/controller.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,UAAU,EAGV,gBAAgB,EAGjB,MAAM,SAAS,CAAC;AAEjB;;;GAGG;AACH,qBAAa,oBAAoB;IAC/B,OAAO,CAAC,OAAO,CAA4B;IAC3C,OAAO,CAAC,SAAS,CAAa;IAC9B,OAAO,CAAC,OAAO,CAAmB;IAElC,OAAO,CAAC,QAAQ,CAAc;IAC9B,OAAO,CAAC,MAAM,CAAa;IAC3B,OAAO,CAAC,YAAY,CAAc;IAClC,OAAO,CAAC,QAAQ,CAA8C;IAC9D,OAAO,CAAC,QAAQ,CAA+D;IAC/E,OAAO,CAAC,WAAW,CAA6B;gBAEpC,IAAI,GAAE,UAAyB;IAI3C;;OAEG;IACH,IAAI,MAAM,IAAI,gBAAgB,CAE7B;IAED;;OAEG;IACH,IAAI,QAAQ,IAAI,MAAM,CAErB;IAED;;OAEG;IACH,KAAK,CACH,OAAO,EAAE,MAAM,EACf,OAAO,EAAE,CAAC,KAAK,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,KAAK,IAAI,EACrD,UAAU,CAAC,EAAE,MAAM,IAAI,GACtB,IAAI;IAcP;;OAEG;IACH,KAAK,IAAI,IAAI;IAOb;;OAEG;IACH,MAAM,IAAI,IAAI;IAOd;;OAEG;IACH,IAAI,IAAI,IAAI;IAWZ;;OAEG;IACH,SAAS,IAAI,IAAI;IAsBjB;;OAEG;IACH,OAAO,CAAC,IAAI,EAAE,UAAU,GAAG,IAAI;IAI/B;;OAEG;IACH,OAAO,CAAC,cAAc;IAOtB;;OAEG;IACH,OAAO,CAAC,aAAa;IAgBrB;;OAEG;IACH,OAAO,CAAC,YAAY;IA2BpB;;OAEG;IACH,OAAO,CAAC,UAAU;IAclB;;OAEG;IACH,OAAO,CAAC,SAAS;IAUjB;;OAEG;IACH,OAAO,CAAC,WAAW;CAMpB"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/output-rate/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,oBAAoB,EAAE,MAAM,cAAc,CAAC;AACpD,YAAY,EACV,UAAU,EACV,gBAAgB,EAChB,gBAAgB,EAChB,gBAAgB,GACjB,MAAM,SAAS,CAAC;AACjB,OAAO,EAAE,YAAY,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC"}
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* 预设速率档位
|
|
3
|
+
*/
|
|
4
|
+
export type OutputRatePreset = 'slow' | 'medium' | 'fast' | 'instant';
|
|
5
|
+
/**
|
|
6
|
+
* 自定义速率配置
|
|
7
|
+
*/
|
|
8
|
+
export interface OutputRateCustom {
|
|
9
|
+
/** 每次输出的间隔时间 (ms) */
|
|
10
|
+
interval: number;
|
|
11
|
+
/** 每次输出的字符数 */
|
|
12
|
+
chunkSize: number;
|
|
13
|
+
}
|
|
14
|
+
/**
|
|
15
|
+
* 速率配置
|
|
16
|
+
*/
|
|
17
|
+
export type OutputRate = OutputRatePreset | OutputRateCustom;
|
|
18
|
+
/**
|
|
19
|
+
* 控制器状态
|
|
20
|
+
*/
|
|
21
|
+
export type OutputRateStatus = 'idle' | 'running' | 'paused' | 'complete';
|
|
22
|
+
/**
|
|
23
|
+
* 预设速率配置映射
|
|
24
|
+
*/
|
|
25
|
+
export declare const RATE_PRESETS: Record<OutputRatePreset, OutputRateCustom>;
|
|
26
|
+
/**
|
|
27
|
+
* 默认速率
|
|
28
|
+
*/
|
|
29
|
+
export declare const DEFAULT_RATE: OutputRatePreset;
|
|
30
|
+
//# sourceMappingURL=types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/output-rate/types.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,MAAM,MAAM,gBAAgB,GAAG,MAAM,GAAG,QAAQ,GAAG,MAAM,GAAG,SAAS,CAAC;AAEtE;;GAEG;AACH,MAAM,WAAW,gBAAgB;IAC/B,qBAAqB;IACrB,QAAQ,EAAE,MAAM,CAAC;IACjB,eAAe;IACf,SAAS,EAAE,MAAM,CAAC;CACnB;AAED;;GAEG;AACH,MAAM,MAAM,UAAU,GAAG,gBAAgB,GAAG,gBAAgB,CAAC;AAE7D;;GAEG;AACH,MAAM,MAAM,gBAAgB,GAAG,MAAM,GAAG,SAAS,GAAG,QAAQ,GAAG,UAAU,CAAC;AAE1E;;GAEG;AACH,eAAO,MAAM,YAAY,EAAE,MAAM,CAAC,gBAAgB,EAAE,gBAAgB,CAKnE,CAAC;AAEF;;GAEG;AACH,eAAO,MAAM,YAAY,EAAE,gBAA2B,CAAC"}
|
package/dist/parse.d.ts
ADDED
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
import { Root } from 'hast';
|
|
2
|
+
import { ParseOptions, ProcessorOptions } from './types';
|
|
3
|
+
|
|
4
|
+
/**
|
|
5
|
+
* 将 Markdown 解析为 HAST(Hypertext Abstract Syntax Tree)
|
|
6
|
+
*
|
|
7
|
+
* @param content - Markdown 源文本
|
|
8
|
+
* @param options - 解析配置
|
|
9
|
+
* @returns HAST 根节点
|
|
10
|
+
*
|
|
11
|
+
* @example
|
|
12
|
+
* ```ts
|
|
13
|
+
* const hast = parseToHast('# Hello World');
|
|
14
|
+
* console.log(hast.children);
|
|
15
|
+
* ```
|
|
16
|
+
*/
|
|
17
|
+
export declare function parseToHast(content: string, options?: ProcessorOptions): Root;
|
|
18
|
+
/**
|
|
19
|
+
* 将 Markdown 解析为 HTML 字符串
|
|
20
|
+
*
|
|
21
|
+
* @param content - Markdown 源文本
|
|
22
|
+
* @param options - 解析配置
|
|
23
|
+
* @returns HTML 字符串
|
|
24
|
+
*
|
|
25
|
+
* @example
|
|
26
|
+
* ```ts
|
|
27
|
+
* const html = parseToHtml('# Hello World');
|
|
28
|
+
* // => '<h1>Hello World</h1>'
|
|
29
|
+
* ```
|
|
30
|
+
*/
|
|
31
|
+
export declare function parseToHtml(content: string, options?: ProcessorOptions): string;
|
|
32
|
+
/**
|
|
33
|
+
* 通用解析函数,支持输出 HAST 或 HTML
|
|
34
|
+
*
|
|
35
|
+
* @param options - 解析配置(包含 content)
|
|
36
|
+
* @returns 解析结果对象
|
|
37
|
+
*/
|
|
38
|
+
export declare function parse(options: ParseOptions): {
|
|
39
|
+
hast: Root;
|
|
40
|
+
html: string;
|
|
41
|
+
};
|
|
42
|
+
//# sourceMappingURL=parse.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"parse.d.ts","sourceRoot":"","sources":["../src/parse.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;AAEjC,OAAO,KAAK,EAAE,YAAY,EAAE,gBAAgB,EAAE,MAAM,SAAS,CAAC;AAE9D;;;;;;;;;;;;GAYG;AACH,wBAAgB,WAAW,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,GAAE,gBAAqB,GAAG,IAAI,CAKjF;AAED;;;;;;;;;;;;GAYG;AACH,wBAAgB,WAAW,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,GAAE,gBAAqB,GAAG,MAAM,CAInF;AAED;;;;;GAKG;AACH,wBAAgB,KAAK,CAAC,OAAO,EAAE,YAAY,GAAG;IAAE,IAAI,EAAE,IAAI,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,CAMzE"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/plugins/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,eAAe,EAAE,MAAM,qBAAqB,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"rehype-image-size.d.ts","sourceRoot":"","sources":["../../src/plugins/rehype-image-size.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,IAAI,EAAW,MAAM,MAAM,CAAC;AAoC1C;;;GAGG;AACH,wBAAgB,eAAe,KACrB,MAAM,IAAI,UAcnB;AAED,eAAe,eAAe,CAAC"}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
import { ProcessorOptions } from './types';
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* 创建 unified processor
|
|
5
|
+
*
|
|
6
|
+
* @param options - 配置选项
|
|
7
|
+
* @returns 配置好的 unified processor
|
|
8
|
+
*
|
|
9
|
+
* @example
|
|
10
|
+
* ```ts
|
|
11
|
+
* const processor = createProcessor({ gfm: true, highlight: true });
|
|
12
|
+
* const hast = processor.runSync(processor.parse('# Hello'));
|
|
13
|
+
* ```
|
|
14
|
+
*/
|
|
15
|
+
export declare function createProcessor(options?: ProcessorOptions): any;
|
|
16
|
+
/**
|
|
17
|
+
* 默认 processor 实例(启用 GFM 和代码高亮,不启用数学公式)
|
|
18
|
+
*/
|
|
19
|
+
export declare const defaultProcessor: any;
|
|
20
|
+
//# sourceMappingURL=processor.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"processor.d.ts","sourceRoot":"","sources":["../src/processor.ts"],"names":[],"mappings":"AAQA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,SAAS,CAAC;AAEhD;;;;;;;;;;;GAWG;AACH,wBAAgB,eAAe,CAAC,OAAO,GAAE,gBAAqB,OA2C7D;AAED;;GAEG;AACH,eAAO,MAAM,gBAAgB,KAAoB,CAAC"}
|
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
import { Element } from 'hast';
|
|
2
|
+
import { BlockInfo, BlockType } from './types';
|
|
3
|
+
|
|
4
|
+
/**
|
|
5
|
+
* 块缓存管理器
|
|
6
|
+
* 用于缓存已稳定块的 HAST 节点,避免重复解析
|
|
7
|
+
*/
|
|
8
|
+
export declare class BlockCache {
|
|
9
|
+
/** 按位置索引的缓存 */
|
|
10
|
+
private cache;
|
|
11
|
+
/** 缓存命中次数 */
|
|
12
|
+
private hits;
|
|
13
|
+
/** 缓存未命中次数 */
|
|
14
|
+
private misses;
|
|
15
|
+
/**
|
|
16
|
+
* 生成块的 key
|
|
17
|
+
* 仅使用 index,确保流式输入和状态变化时组件实例保持稳定
|
|
18
|
+
* memo 的比较函数会决定是否跳过重渲染
|
|
19
|
+
*/
|
|
20
|
+
generateKey(index: number, _source: string, _stable: boolean): string;
|
|
21
|
+
/**
|
|
22
|
+
* 尝试从缓存获取块的 HAST
|
|
23
|
+
*/
|
|
24
|
+
get(index: number, source: string): Element | null;
|
|
25
|
+
/**
|
|
26
|
+
* 缓存块的 HAST
|
|
27
|
+
*/
|
|
28
|
+
set(index: number, source: string, hast: Element): void;
|
|
29
|
+
/**
|
|
30
|
+
* 检查是否有缓存
|
|
31
|
+
*/
|
|
32
|
+
has(index: number, source: string): boolean;
|
|
33
|
+
/**
|
|
34
|
+
* 清除指定索引之后的所有缓存
|
|
35
|
+
*/
|
|
36
|
+
invalidateFrom(index: number): void;
|
|
37
|
+
/**
|
|
38
|
+
* 清空所有缓存
|
|
39
|
+
*/
|
|
40
|
+
clear(): void;
|
|
41
|
+
/**
|
|
42
|
+
* 获取缓存统计
|
|
43
|
+
*/
|
|
44
|
+
getStats(): {
|
|
45
|
+
hits: number;
|
|
46
|
+
misses: number;
|
|
47
|
+
};
|
|
48
|
+
/**
|
|
49
|
+
* 创建带 key 的块信息
|
|
50
|
+
*/
|
|
51
|
+
createBlockInfo(index: number, source: string, type: BlockType, stable: boolean, hast: Element | null): BlockInfo;
|
|
52
|
+
}
|
|
53
|
+
//# sourceMappingURL=block-cache.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"block-cache.d.ts","sourceRoot":"","sources":["../../src/streaming/block-cache.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,MAAM,CAAC;AACpC,OAAO,KAAK,EAAE,SAAS,EAAE,SAAS,EAAE,MAAM,SAAS,CAAC;AAwBpD;;;GAGG;AACH,qBAAa,UAAU;IACrB,eAAe;IACf,OAAO,CAAC,KAAK,CAAsC;IAEnD,aAAa;IACb,OAAO,CAAC,IAAI,CAAK;IAEjB,cAAc;IACd,OAAO,CAAC,MAAM,CAAK;IAEnB;;;;OAIG;IACH,WAAW,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,GAAG,MAAM;IAIrE;;OAEG;IACH,GAAG,CAAC,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,OAAO,GAAG,IAAI;IAUlD;;OAEG;IACH,GAAG,CAAC,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,OAAO,GAAG,IAAI;IAQvD;;OAEG;IACH,GAAG,CAAC,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,OAAO;IAK3C;;OAEG;IACH,cAAc,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI;IAQnC;;OAEG;IACH,KAAK,IAAI,IAAI;IAMb;;OAEG;IACH,QAAQ,IAAI;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAA;KAAE;IAI5C;;OAEG;IACH,eAAe,CACb,KAAK,EAAE,MAAM,EACb,MAAM,EAAE,MAAM,EACd,IAAI,EAAE,SAAS,EACf,MAAM,EAAE,OAAO,EACf,IAAI,EAAE,OAAO,GAAG,IAAI,GACnB,SAAS;CAUb"}
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
import { BlockType } from './types';
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* 原始块信息(分割后未解析)
|
|
5
|
+
*/
|
|
6
|
+
export interface RawBlock {
|
|
7
|
+
source: string;
|
|
8
|
+
type: BlockType;
|
|
9
|
+
stable: boolean;
|
|
10
|
+
startIndex: number;
|
|
11
|
+
}
|
|
12
|
+
/**
|
|
13
|
+
* 块边界分割器
|
|
14
|
+
* 将 Markdown 内容按块级元素边界分割
|
|
15
|
+
*/
|
|
16
|
+
export declare class BlockSplitter {
|
|
17
|
+
private codeBlockState;
|
|
18
|
+
/**
|
|
19
|
+
* 分割内容为块
|
|
20
|
+
*/
|
|
21
|
+
split(content: string): RawBlock[];
|
|
22
|
+
/**
|
|
23
|
+
* 检测是否是代码围栏
|
|
24
|
+
*/
|
|
25
|
+
private isCodeFence;
|
|
26
|
+
/**
|
|
27
|
+
* 提取围栏字符
|
|
28
|
+
*/
|
|
29
|
+
private extractFence;
|
|
30
|
+
/**
|
|
31
|
+
* 检测是否是匹配的闭合围栏
|
|
32
|
+
*/
|
|
33
|
+
private isMatchingCloseFence;
|
|
34
|
+
/**
|
|
35
|
+
* 检测块类型
|
|
36
|
+
*/
|
|
37
|
+
private detectBlockType;
|
|
38
|
+
}
|
|
39
|
+
//# sourceMappingURL=block-splitter.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"block-splitter.d.ts","sourceRoot":"","sources":["../../src/streaming/block-splitter.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,SAAS,CAAC;AAEzC;;GAEG;AACH,MAAM,WAAW,QAAQ;IACvB,MAAM,EAAE,MAAM,CAAC;IACf,IAAI,EAAE,SAAS,CAAC;IAChB,MAAM,EAAE,OAAO,CAAC;IAChB,UAAU,EAAE,MAAM,CAAC;CACpB;AAWD;;;GAGG;AACH,qBAAa,aAAa;IACxB,OAAO,CAAC,cAAc,CAIpB;IAEF;;OAEG;IACH,KAAK,CAAC,OAAO,EAAE,MAAM,GAAG,QAAQ,EAAE;IAoNlC;;OAEG;IACH,OAAO,CAAC,WAAW;IAKnB;;OAEG;IACH,OAAO,CAAC,YAAY;IAKpB;;OAEG;IACH,OAAO,CAAC,oBAAoB;IAU5B;;OAEG;IACH,OAAO,CAAC,eAAe;CAmCxB"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* 流式解析模块
|
|
3
|
+
*/
|
|
4
|
+
export { createStreamingParser } from './streaming-parser';
|
|
5
|
+
export { BlockSplitter } from './block-splitter';
|
|
6
|
+
export { BlockCache } from './block-cache';
|
|
7
|
+
export { StreamBuffer, createInitialBufferState } from './stream-buffer';
|
|
8
|
+
export type { StreamTokenType, StreamBufferState } from './stream-buffer';
|
|
9
|
+
export type { StreamingParser, StreamingParserOptions, ParserState, ParserStats, BlockInfo, BlockType, } from './types';
|
|
10
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/streaming/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,qBAAqB,EAAE,MAAM,oBAAoB,CAAC;AAC3D,OAAO,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAC;AACjD,OAAO,EAAE,UAAU,EAAE,MAAM,eAAe,CAAC;AAC3C,OAAO,EAAE,YAAY,EAAE,wBAAwB,EAAE,MAAM,iBAAiB,CAAC;AACzE,YAAY,EAAE,eAAe,EAAE,iBAAiB,EAAE,MAAM,iBAAiB,CAAC;AAC1E,YAAY,EACV,eAAe,EACf,sBAAsB,EACtB,WAAW,EACX,WAAW,EACX,SAAS,EACT,SAAS,GACV,MAAM,SAAS,CAAC"}
|
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* 流式缓冲处理器
|
|
3
|
+
* 借鉴 x-markdown 的字符级增量处理策略
|
|
4
|
+
* 用于精细控制不完整 Markdown 语法的显示
|
|
5
|
+
*/
|
|
6
|
+
/**
|
|
7
|
+
* Token 类型
|
|
8
|
+
* 注意:emphasis、inline-code、link、image、table 不再缓冲
|
|
9
|
+
* - emphasis/inline-code/link/image 由 InlineCompleter 自动补全闭合标记
|
|
10
|
+
* - table 改为渐进式逐行显示
|
|
11
|
+
*/
|
|
12
|
+
export type StreamTokenType = 'text' | 'html';
|
|
13
|
+
/**
|
|
14
|
+
* 流式缓冲状态
|
|
15
|
+
*/
|
|
16
|
+
export interface StreamBufferState {
|
|
17
|
+
/** 待处理的内容 */
|
|
18
|
+
pending: string;
|
|
19
|
+
/** 当前 token 类型 */
|
|
20
|
+
token: StreamTokenType;
|
|
21
|
+
/** 已处理的字符数 */
|
|
22
|
+
processedLength: number;
|
|
23
|
+
/** 已确认完整的 Markdown */
|
|
24
|
+
completeMarkdown: string;
|
|
25
|
+
}
|
|
26
|
+
/**
|
|
27
|
+
* 创建初始缓冲状态
|
|
28
|
+
*/
|
|
29
|
+
export declare function createInitialBufferState(): StreamBufferState;
|
|
30
|
+
/**
|
|
31
|
+
* 流式缓冲处理器
|
|
32
|
+
*/
|
|
33
|
+
export declare class StreamBuffer {
|
|
34
|
+
private state;
|
|
35
|
+
constructor();
|
|
36
|
+
/**
|
|
37
|
+
* 处理输入文本,返回可以安全显示的 Markdown
|
|
38
|
+
*/
|
|
39
|
+
process(input: string): string;
|
|
40
|
+
/**
|
|
41
|
+
* 完成处理,刷新所有缓冲
|
|
42
|
+
*/
|
|
43
|
+
finish(): string;
|
|
44
|
+
/**
|
|
45
|
+
* 获取完整内容(包括待处理部分)
|
|
46
|
+
*/
|
|
47
|
+
getFullContent(): string;
|
|
48
|
+
/**
|
|
49
|
+
* 获取当前 token 类型
|
|
50
|
+
*/
|
|
51
|
+
getCurrentToken(): StreamTokenType;
|
|
52
|
+
/**
|
|
53
|
+
* 获取待处理内容
|
|
54
|
+
*/
|
|
55
|
+
getPending(): string;
|
|
56
|
+
/**
|
|
57
|
+
* 重置状态
|
|
58
|
+
*/
|
|
59
|
+
reset(): void;
|
|
60
|
+
}
|
|
61
|
+
//# sourceMappingURL=stream-buffer.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"stream-buffer.d.ts","sourceRoot":"","sources":["../../src/streaming/stream-buffer.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH;;;;;GAKG;AACH,MAAM,MAAM,eAAe,GACvB,MAAM,GACN,MAAM,CAAC;AAEX;;GAEG;AACH,MAAM,WAAW,iBAAiB;IAChC,aAAa;IACb,OAAO,EAAE,MAAM,CAAC;IAChB,kBAAkB;IAClB,KAAK,EAAE,eAAe,CAAC;IACvB,cAAc;IACd,eAAe,EAAE,MAAM,CAAC;IACxB,sBAAsB;IACtB,gBAAgB,EAAE,MAAM,CAAC;CAC1B;AA8KD;;GAEG;AACH,wBAAgB,wBAAwB,IAAI,iBAAiB,CAO5D;AA6BD;;GAEG;AACH,qBAAa,YAAY;IACvB,OAAO,CAAC,KAAK,CAAoB;;IAMjC;;OAEG;IACH,OAAO,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM;IAwD9B;;OAEG;IACH,MAAM,IAAI,MAAM;IAKhB;;OAEG;IACH,cAAc,IAAI,MAAM;IAIxB;;OAEG;IACH,eAAe,IAAI,eAAe;IAIlC;;OAEG;IACH,UAAU,IAAI,MAAM;IAIpB;;OAEG;IACH,KAAK,IAAI,IAAI;CAGd"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"streaming-parser.d.ts","sourceRoot":"","sources":["../../src/streaming/streaming-parser.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EACV,eAAe,EACf,sBAAsB,EAIvB,MAAM,SAAS,CAAC;AAOjB;;GAEG;AACH,wBAAgB,qBAAqB,CACnC,OAAO,GAAE,sBAA2B,GACnC,eAAe,CAySjB"}
|
|
@@ -0,0 +1,104 @@
|
|
|
1
|
+
import { Root, Element } from 'hast';
|
|
2
|
+
import { ProcessorOptions } from '../types';
|
|
3
|
+
import { InlineType } from '../inline-prediction';
|
|
4
|
+
|
|
5
|
+
/**
|
|
6
|
+
* 块信息
|
|
7
|
+
*/
|
|
8
|
+
export interface BlockInfo {
|
|
9
|
+
/** 块的唯一标识 */
|
|
10
|
+
key: string;
|
|
11
|
+
/** 块的原始文本 */
|
|
12
|
+
source: string;
|
|
13
|
+
/** 块是否稳定(已闭合) */
|
|
14
|
+
stable: boolean;
|
|
15
|
+
/** 块在列表中的索引 */
|
|
16
|
+
index: number;
|
|
17
|
+
/** 块类型 */
|
|
18
|
+
type: BlockType;
|
|
19
|
+
/** 解析后的 HAST 节点 */
|
|
20
|
+
hast: Element | null;
|
|
21
|
+
}
|
|
22
|
+
/**
|
|
23
|
+
* 块类型
|
|
24
|
+
*/
|
|
25
|
+
export type BlockType = 'paragraph' | 'heading' | 'code' | 'list' | 'blockquote' | 'thematicBreak' | 'table' | 'html' | 'unknown';
|
|
26
|
+
/**
|
|
27
|
+
* 解析器状态
|
|
28
|
+
*/
|
|
29
|
+
export interface ParserState {
|
|
30
|
+
/** 完整的 HAST 树 */
|
|
31
|
+
hast: Root;
|
|
32
|
+
/** 块信息列表 */
|
|
33
|
+
blocks: BlockInfo[];
|
|
34
|
+
/** 是否已完成 */
|
|
35
|
+
isComplete: boolean;
|
|
36
|
+
}
|
|
37
|
+
/**
|
|
38
|
+
* 性能统计
|
|
39
|
+
*/
|
|
40
|
+
export interface ParserStats {
|
|
41
|
+
/** 总追加次数 */
|
|
42
|
+
totalAppends: number;
|
|
43
|
+
/** 缓存命中次数 */
|
|
44
|
+
cacheHits: number;
|
|
45
|
+
/** 缓存未命中次数 */
|
|
46
|
+
cacheMisses: number;
|
|
47
|
+
/** 平均解析时间 (ms) */
|
|
48
|
+
avgParseTime: number;
|
|
49
|
+
/** 总解析时间 (ms) */
|
|
50
|
+
totalParseTime: number;
|
|
51
|
+
}
|
|
52
|
+
/**
|
|
53
|
+
* 流式解析器配置
|
|
54
|
+
*/
|
|
55
|
+
export interface StreamingParserOptions extends ProcessorOptions {
|
|
56
|
+
/** 是否启用块缓存,默认 true */
|
|
57
|
+
enableCache?: boolean;
|
|
58
|
+
/** 是否启用行内预测,默认 true */
|
|
59
|
+
enableInlinePrediction?: boolean;
|
|
60
|
+
/** 预测的行内标记类型,默认全部 */
|
|
61
|
+
predictedInlineTypes?: InlineType[];
|
|
62
|
+
/**
|
|
63
|
+
* 是否缓冲(暂不显示)不确定的块级前缀,默认 true。
|
|
64
|
+
* 典型场景:流式输出刚好停在列表前缀 "-" / "1." 时,避免先显示前缀后又变成列表导致闪现。
|
|
65
|
+
*/
|
|
66
|
+
bufferUncertainPrefixes?: boolean;
|
|
67
|
+
/**
|
|
68
|
+
* 是否启用字符级流式缓冲,默认 false。
|
|
69
|
+
* 启用后会使用更精细的字符级 token 识别,适用于对闪烁敏感的场景。
|
|
70
|
+
* 注意:会略微增加 CPU 开销。
|
|
71
|
+
*/
|
|
72
|
+
enableCharacterBuffer?: boolean;
|
|
73
|
+
}
|
|
74
|
+
/**
|
|
75
|
+
* 流式解析器接口
|
|
76
|
+
*/
|
|
77
|
+
export interface StreamingParser {
|
|
78
|
+
/**
|
|
79
|
+
* 追加内容
|
|
80
|
+
* @param chunk 要追加的内容片段
|
|
81
|
+
*/
|
|
82
|
+
append(chunk: string): void;
|
|
83
|
+
/**
|
|
84
|
+
* 获取当前解析状态
|
|
85
|
+
*/
|
|
86
|
+
getState(): ParserState;
|
|
87
|
+
/**
|
|
88
|
+
* 获取性能统计
|
|
89
|
+
*/
|
|
90
|
+
getStats(): ParserStats;
|
|
91
|
+
/**
|
|
92
|
+
* 标记解析完成
|
|
93
|
+
*/
|
|
94
|
+
finish(): void;
|
|
95
|
+
/**
|
|
96
|
+
* 重置解析器
|
|
97
|
+
*/
|
|
98
|
+
reset(): void;
|
|
99
|
+
/**
|
|
100
|
+
* 获取累积的内容
|
|
101
|
+
*/
|
|
102
|
+
getContent(): string;
|
|
103
|
+
}
|
|
104
|
+
//# sourceMappingURL=types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/streaming/types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,MAAM,CAAC;AAC1C,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,UAAU,CAAC;AACjD,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,sBAAsB,CAAC;AAEvD;;GAEG;AACH,MAAM,WAAW,SAAS;IACxB,aAAa;IACb,GAAG,EAAE,MAAM,CAAC;IACZ,aAAa;IACb,MAAM,EAAE,MAAM,CAAC;IACf,iBAAiB;IACjB,MAAM,EAAE,OAAO,CAAC;IAChB,eAAe;IACf,KAAK,EAAE,MAAM,CAAC;IACd,UAAU;IACV,IAAI,EAAE,SAAS,CAAC;IAChB,mBAAmB;IACnB,IAAI,EAAE,OAAO,GAAG,IAAI,CAAC;CACtB;AAED;;GAEG;AACH,MAAM,MAAM,SAAS,GACjB,WAAW,GACX,SAAS,GACT,MAAM,GACN,MAAM,GACN,YAAY,GACZ,eAAe,GACf,OAAO,GACP,MAAM,GACN,SAAS,CAAC;AAEd;;GAEG;AACH,MAAM,WAAW,WAAW;IAC1B,iBAAiB;IACjB,IAAI,EAAE,IAAI,CAAC;IACX,YAAY;IACZ,MAAM,EAAE,SAAS,EAAE,CAAC;IACpB,YAAY;IACZ,UAAU,EAAE,OAAO,CAAC;CACrB;AAED;;GAEG;AACH,MAAM,WAAW,WAAW;IAC1B,YAAY;IACZ,YAAY,EAAE,MAAM,CAAC;IACrB,aAAa;IACb,SAAS,EAAE,MAAM,CAAC;IAClB,cAAc;IACd,WAAW,EAAE,MAAM,CAAC;IACpB,kBAAkB;IAClB,YAAY,EAAE,MAAM,CAAC;IACrB,iBAAiB;IACjB,cAAc,EAAE,MAAM,CAAC;CACxB;AAED;;GAEG;AACH,MAAM,WAAW,sBAAuB,SAAQ,gBAAgB;IAC9D,sBAAsB;IACtB,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,uBAAuB;IACvB,sBAAsB,CAAC,EAAE,OAAO,CAAC;IACjC,qBAAqB;IACrB,oBAAoB,CAAC,EAAE,UAAU,EAAE,CAAC;IACpC;;;OAGG;IACH,uBAAuB,CAAC,EAAE,OAAO,CAAC;IAClC;;;;OAIG;IACH,qBAAqB,CAAC,EAAE,OAAO,CAAC;CACjC;AAED;;GAEG;AACH,MAAM,WAAW,eAAe;IAC9B;;;OAGG;IACH,MAAM,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;IAE5B;;OAEG;IACH,QAAQ,IAAI,WAAW,CAAC;IAExB;;OAEG;IACH,QAAQ,IAAI,WAAW,CAAC;IAExB;;OAEG;IACH,MAAM,IAAI,IAAI,CAAC;IAEf;;OAEG;IACH,KAAK,IAAI,IAAI,CAAC;IAEd;;OAEG;IACH,UAAU,IAAI,MAAM,CAAC;CACtB"}
|