stream-markdown-parser 0.0.59-beta.0 → 0.0.59-beta.10
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 +21 -30
- package/README.zh-CN.md +21 -30
- package/dist/index.d.ts +2 -14
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +939 -314
- package/dist/index.js.map +1 -1
- package/package.json +13 -15
package/README.md
CHANGED
|
@@ -45,7 +45,7 @@ yarn add stream-markdown-parser
|
|
|
45
45
|
- `getMarkdown(msgId?, options?)` — create a `markdown-it-ts` instance with built-in plugins (task lists, sub/sup, math helpers, etc.). Also accepts `plugin`, `apply`, and `i18n` options.
|
|
46
46
|
- `registerMarkdownPlugin(plugin)` / `clearRegisteredMarkdownPlugins()` — add or remove global plugins that run for every `getMarkdown()` call (useful for feature flags or tests).
|
|
47
47
|
- `parseMarkdownToStructure(markdown, md, parseOptions)` — convert Markdown into the streaming-friendly AST consumed by `markstream-vue` and other renderers.
|
|
48
|
-
- `processTokens(tokens)` / `parseInlineTokens(children, content)` — low-level helpers if you want to bypass the built-in AST pipeline.
|
|
48
|
+
- `processTokens(tokens)` / `parseInlineTokens(children, content?, preToken?, options?)` — low-level helpers if you want to bypass the built-in AST pipeline.
|
|
49
49
|
- `applyMath`, `applyContainers`, `normalizeStandaloneBackslashT`, `findMatchingClose`, etc. — utilities for custom parsing or linting workflows.
|
|
50
50
|
|
|
51
51
|
## Usage
|
|
@@ -55,7 +55,7 @@ yarn add stream-markdown-parser
|
|
|
55
55
|
```
|
|
56
56
|
Markdown string
|
|
57
57
|
↓ getMarkdown() → markdown-it-ts instance with plugins
|
|
58
|
-
parseMarkdownToStructure() → AST (ParsedNode[])
|
|
58
|
+
parseMarkdownToStructure(markdown, md) → AST (ParsedNode[])
|
|
59
59
|
↓ feed into your renderer (markstream-vue, custom UI, workers)
|
|
60
60
|
```
|
|
61
61
|
|
|
@@ -210,13 +210,13 @@ interface GetMarkdownOptions {
|
|
|
210
210
|
}
|
|
211
211
|
```
|
|
212
212
|
|
|
213
|
-
#### `parseMarkdownToStructure(content, md
|
|
213
|
+
#### `parseMarkdownToStructure(content, md, options?)`
|
|
214
214
|
|
|
215
215
|
Parses markdown content into a structured node tree.
|
|
216
216
|
|
|
217
217
|
**Parameters:**
|
|
218
218
|
- `content` (string): The markdown content to parse
|
|
219
|
-
- `md` (MarkdownItCore
|
|
219
|
+
- `md` (MarkdownItCore): A markdown-it-ts instance created with `getMarkdown()`
|
|
220
220
|
- `options` (ParseOptions, optional): Parsing options with hooks
|
|
221
221
|
|
|
222
222
|
**Returns:** `ParsedNode[]` - An array of parsed nodes
|
|
@@ -225,9 +225,9 @@ Parses markdown content into a structured node tree.
|
|
|
225
225
|
|
|
226
226
|
Processes raw markdown-it tokens into a flat array.
|
|
227
227
|
|
|
228
|
-
#### `parseInlineTokens(tokens,
|
|
228
|
+
#### `parseInlineTokens(tokens, content?, preToken?, options?)`
|
|
229
229
|
|
|
230
|
-
Parses inline markdown-it-ts tokens.
|
|
230
|
+
Parses inline markdown-it-ts tokens into renderer nodes. Pass the inline token array plus the optional raw `content` string (from the parent token), an optional previous token, and inline parse options (`requireClosingStrong`, `customHtmlTags`).
|
|
231
231
|
|
|
232
232
|
### Configuration Functions
|
|
233
233
|
|
|
@@ -247,17 +247,18 @@ interface MathOptions {
|
|
|
247
247
|
|
|
248
248
|
### Parse hooks (fine-grained transforms)
|
|
249
249
|
|
|
250
|
-
|
|
250
|
+
ParseOptions supports the following hooks and flags:
|
|
251
251
|
|
|
252
252
|
```ts
|
|
253
253
|
interface ParseOptions {
|
|
254
254
|
preTransformTokens?: (tokens: Token[]) => Token[]
|
|
255
255
|
postTransformTokens?: (tokens: Token[]) => Token[]
|
|
256
|
-
postTransformNodes?: (nodes: ParsedNode[]) => ParsedNode[]
|
|
257
256
|
// Custom HTML-like tags to emit as custom nodes (e.g. ['thinking'])
|
|
258
257
|
customHtmlTags?: string[]
|
|
259
|
-
//
|
|
260
|
-
|
|
258
|
+
// When true, treats the input as complete (end-of-stream)
|
|
259
|
+
final?: boolean
|
|
260
|
+
// Require closing `**` for strong parsing (default: false)
|
|
261
|
+
requireClosingStrong?: boolean
|
|
261
262
|
}
|
|
262
263
|
```
|
|
263
264
|
|
|
@@ -265,32 +266,22 @@ Example — flag AI “thinking” blocks:
|
|
|
265
266
|
|
|
266
267
|
```ts
|
|
267
268
|
const parseOptions = {
|
|
268
|
-
|
|
269
|
-
return nodes.map(node =>
|
|
270
|
-
node.type === 'html_block' && /<thinking>/.test(node.value)
|
|
271
|
-
? { ...node, meta: { type: 'thinking' } }
|
|
272
|
-
: node,
|
|
273
|
-
)
|
|
274
|
-
},
|
|
269
|
+
customHtmlTags: ['thinking'],
|
|
275
270
|
}
|
|
271
|
+
|
|
272
|
+
const nodes = parseMarkdownToStructure(markdown, md, parseOptions)
|
|
273
|
+
const tagged = nodes.map(node =>
|
|
274
|
+
node.type === 'html_block' && /<thinking>/.test((node as any).content ?? '')
|
|
275
|
+
? { ...node, meta: { type: 'thinking' } }
|
|
276
|
+
: node,
|
|
277
|
+
)
|
|
276
278
|
```
|
|
277
279
|
|
|
278
280
|
Use the metadata in your renderer to show custom UI without mangling the original Markdown.
|
|
279
281
|
|
|
280
|
-
|
|
281
|
-
|
|
282
|
-
```ts
|
|
283
|
-
// If upstream content contains placeholder tags like <question> or <analysis>
|
|
284
|
-
// that should be displayed as plain text instead of being interpreted as HTML:
|
|
285
|
-
const nodes = parseMarkdownToStructure('<question>What is 2+2?</question>', md, {
|
|
286
|
-
escapeHtmlTags: ['question', 'answer']
|
|
287
|
-
})
|
|
288
|
-
// Renders as literal text: "<question>What is 2+2?</question>"
|
|
289
|
-
```
|
|
282
|
+
### Unknown HTML-like tags
|
|
290
283
|
|
|
291
|
-
|
|
292
|
-
- If a tag name is present in both `customHtmlTags` and `escapeHtmlTags`, `escapeHtmlTags` takes precedence
|
|
293
|
-
- Tag names are case-insensitive (normalized to lowercase)
|
|
284
|
+
By default, non-standard HTML-like tags (for example `<question>`) are rendered as raw HTML elements once they are complete; during streaming, partial tags are kept as **literal text** to avoid flicker. If you want them emitted as custom nodes (`type: 'question'` with parsed attrs/content), opt in via `customHtmlTags`.
|
|
294
285
|
|
|
295
286
|
### Utility Functions
|
|
296
287
|
|
package/README.zh-CN.md
CHANGED
|
@@ -45,7 +45,7 @@ yarn add stream-markdown-parser
|
|
|
45
45
|
- `getMarkdown(msgId?, options?)` — 返回一个预配置的 `markdown-it-ts` 实例;支持 `plugin`、`apply`、`i18n` 等选项(内置任务列表、上下标、数学等插件)。
|
|
46
46
|
- `registerMarkdownPlugin(plugin)` / `clearRegisteredMarkdownPlugins()` — 全局注册/清除插件,在所有 `getMarkdown()` 调用中生效(适合特性开关或测试环境)。
|
|
47
47
|
- `parseMarkdownToStructure(markdown, md, parseOptions)` — 将 Markdown 转换为可供 `markstream-vue` 等渲染器使用的 AST。
|
|
48
|
-
- `processTokens(tokens)` / `parseInlineTokens(children, content)` — 更底层的 token → 节点工具,方便自定义管线。
|
|
48
|
+
- `processTokens(tokens)` / `parseInlineTokens(children, content?, preToken?, options?)` — 更底层的 token → 节点工具,方便自定义管线。
|
|
49
49
|
- `applyMath`、`applyContainers`、`normalizeStandaloneBackslashT`、`findMatchingClose` 等 — 用于构建自定义解析、lint 或内容清洗流程。
|
|
50
50
|
|
|
51
51
|
## 使用
|
|
@@ -55,7 +55,7 @@ yarn add stream-markdown-parser
|
|
|
55
55
|
```
|
|
56
56
|
Markdown 字符串
|
|
57
57
|
↓ getMarkdown() → 带插件的 markdown-it-ts 实例
|
|
58
|
-
parseMarkdownToStructure() → AST (ParsedNode[])
|
|
58
|
+
parseMarkdownToStructure(markdown, md) → AST (ParsedNode[])
|
|
59
59
|
↓ 交给你的渲染器(markstream-vue、自定义 UI、Worker 等)
|
|
60
60
|
```
|
|
61
61
|
|
|
@@ -209,13 +209,13 @@ interface GetMarkdownOptions {
|
|
|
209
209
|
}
|
|
210
210
|
```
|
|
211
211
|
|
|
212
|
-
#### `parseMarkdownToStructure(content, md
|
|
212
|
+
#### `parseMarkdownToStructure(content, md, options?)`
|
|
213
213
|
|
|
214
214
|
将 Markdown 内容解析为结构化节点树。
|
|
215
215
|
|
|
216
216
|
**参数:**
|
|
217
217
|
- `content` (string): 要解析的 Markdown 内容
|
|
218
|
-
- `md` (MarkdownItCore
|
|
218
|
+
- `md` (MarkdownItCore): 由 `getMarkdown()` 创建的 markdown-it-ts 实例
|
|
219
219
|
- `options` (ParseOptions, 可选): 带有钩子的解析选项
|
|
220
220
|
|
|
221
221
|
**返回值:** `ParsedNode[]` - 解析后的节点数组
|
|
@@ -224,9 +224,9 @@ interface GetMarkdownOptions {
|
|
|
224
224
|
|
|
225
225
|
将原始 markdown-it tokens 处理为扁平数组。
|
|
226
226
|
|
|
227
|
-
#### `parseInlineTokens(tokens,
|
|
227
|
+
#### `parseInlineTokens(tokens, content?, preToken?, options?)`
|
|
228
228
|
|
|
229
|
-
解析内联 markdown-it-ts tokens
|
|
229
|
+
解析内联 markdown-it-ts tokens 并产出节点。可传入原始 `content`(来自父 token)、可选的前一个 token,以及 inline 解析选项(`requireClosingStrong`、`customHtmlTags`)。
|
|
230
230
|
|
|
231
231
|
### 配置函数
|
|
232
232
|
|
|
@@ -246,17 +246,18 @@ interface MathOptions {
|
|
|
246
246
|
|
|
247
247
|
### 解析钩子(精细化变换)
|
|
248
248
|
|
|
249
|
-
|
|
249
|
+
ParseOptions 支持以下钩子与标志:
|
|
250
250
|
|
|
251
251
|
```ts
|
|
252
252
|
interface ParseOptions {
|
|
253
253
|
preTransformTokens?: (tokens: Token[]) => Token[]
|
|
254
254
|
postTransformTokens?: (tokens: Token[]) => Token[]
|
|
255
|
-
postTransformNodes?: (nodes: ParsedNode[]) => ParsedNode[]
|
|
256
255
|
// 自定义 HTML 类标签,作为自定义节点输出(如 ['thinking'])
|
|
257
256
|
customHtmlTags?: string[]
|
|
258
|
-
//
|
|
259
|
-
|
|
257
|
+
// true 表示输入已结束(end-of-stream)
|
|
258
|
+
final?: boolean
|
|
259
|
+
// 解析 strong 时要求闭合 `**`(默认 false)
|
|
260
|
+
requireClosingStrong?: boolean
|
|
260
261
|
}
|
|
261
262
|
```
|
|
262
263
|
|
|
@@ -264,32 +265,22 @@ interface ParseOptions {
|
|
|
264
265
|
|
|
265
266
|
```ts
|
|
266
267
|
const parseOptions = {
|
|
267
|
-
|
|
268
|
-
return nodes.map(node =>
|
|
269
|
-
node.type === 'html_block' && /<thinking>/.test(node.value)
|
|
270
|
-
? { ...node, meta: { type: 'thinking' } }
|
|
271
|
-
: node,
|
|
272
|
-
)
|
|
273
|
-
},
|
|
268
|
+
customHtmlTags: ['thinking'],
|
|
274
269
|
}
|
|
270
|
+
|
|
271
|
+
const nodes = parseMarkdownToStructure(markdown, md, parseOptions)
|
|
272
|
+
const tagged = nodes.map(node =>
|
|
273
|
+
node.type === 'html_block' && /<thinking>/.test((node as any).content ?? '')
|
|
274
|
+
? { ...node, meta: { type: 'thinking' } }
|
|
275
|
+
: node,
|
|
276
|
+
)
|
|
275
277
|
```
|
|
276
278
|
|
|
277
279
|
在渲染器中读取 `node.meta` 即可渲染自定义 UI,而无需直接修改 Markdown 文本。
|
|
278
280
|
|
|
279
|
-
|
|
280
|
-
|
|
281
|
-
```ts
|
|
282
|
-
// 如果上游内容包含占位符标签如 <question> 或 <analysis>,
|
|
283
|
-
// 希望将它们显示为纯文本而不是被解释为 HTML:
|
|
284
|
-
const nodes = parseMarkdownToStructure('<question>2+2 等于几?</question>', md, {
|
|
285
|
-
escapeHtmlTags: ['question', 'answer']
|
|
286
|
-
})
|
|
287
|
-
// 渲染为纯文本:"<question>2+2 等于几?</question>"
|
|
288
|
-
```
|
|
281
|
+
### 未知 HTML 类标签
|
|
289
282
|
|
|
290
|
-
|
|
291
|
-
- 如果一个标签名同时存在于 `customHtmlTags` 和 `escapeHtmlTags`,`escapeHtmlTags` 优先
|
|
292
|
-
- 标签名不区分大小写(会规范化为小写)
|
|
283
|
+
默认情况下,非标准的 HTML 类标签(例如 `<question>`)在完整闭合时会按原生 HTML 渲染(作为自定义元素输出);流式场景下未闭合的片段会先按**纯文本**处理以避免闪烁。若希望它们作为自定义节点输出(`type: 'question'`,携带 attrs/content),需要在 `customHtmlTags` 中显式声明。
|
|
293
284
|
|
|
294
285
|
### 工具函数
|
|
295
286
|
|
package/dist/index.d.ts
CHANGED
|
@@ -252,10 +252,12 @@ interface HardBreakNode extends BaseNode {
|
|
|
252
252
|
interface MathInlineNode extends BaseNode {
|
|
253
253
|
type: 'math_inline';
|
|
254
254
|
content: string;
|
|
255
|
+
markup?: string;
|
|
255
256
|
}
|
|
256
257
|
interface MathBlockNode extends BaseNode {
|
|
257
258
|
type: 'math_block';
|
|
258
259
|
content: string;
|
|
260
|
+
markup?: string;
|
|
259
261
|
}
|
|
260
262
|
interface ReferenceNode extends BaseNode {
|
|
261
263
|
type: 'reference';
|
|
@@ -334,19 +336,6 @@ interface ParseOptions {
|
|
|
334
336
|
* to enable mid-state suppression for the same tags during streaming.
|
|
335
337
|
*/
|
|
336
338
|
customHtmlTags?: string[];
|
|
337
|
-
/**
|
|
338
|
-
* HTML-like tag names that should be rendered as literal text instead of
|
|
339
|
-
* `html_inline`/`html_block` nodes (e.g. ['question', 'analysis']).
|
|
340
|
-
*
|
|
341
|
-
* Useful when upstream content may contain placeholder tags like `<question>`
|
|
342
|
-
* but you want them to display as plain text rather than being interpreted
|
|
343
|
-
* as HTML.
|
|
344
|
-
*
|
|
345
|
-
* Note: this applies to both inline and block HTML tokens. If a tag name is
|
|
346
|
-
* present in both `customHtmlTags` and `escapeHtmlTags`, `escapeHtmlTags`
|
|
347
|
-
* takes precedence.
|
|
348
|
-
*/
|
|
349
|
-
escapeHtmlTags?: string[];
|
|
350
339
|
debug?: boolean;
|
|
351
340
|
}
|
|
352
341
|
type PostTransformNodesHook = (nodes: ParsedNode[]) => ParsedNode[];
|
|
@@ -355,7 +344,6 @@ type PostTransformNodesHook = (nodes: ParsedNode[]) => ParsedNode[];
|
|
|
355
344
|
declare function parseInlineTokens(tokens: MarkdownToken[], raw?: string, pPreToken?: MarkdownToken, options?: {
|
|
356
345
|
requireClosingStrong?: boolean;
|
|
357
346
|
customHtmlTags?: readonly string[];
|
|
358
|
-
escapeHtmlTags?: readonly string[];
|
|
359
347
|
}): ParsedNode[];
|
|
360
348
|
//#endregion
|
|
361
349
|
//#region src/parser/index.d.ts
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","names":[],"sources":["../src/factory.ts","../src/types.ts","../src/parser/inline-parsers/index.ts","../src/parser/index.ts","../src/config.ts","../src/findMatchingClose.ts","../src/parser/inline-parsers/fence-parser.ts","../src/plugins/containers.ts","../src/plugins/isMathLike.ts","../src/plugins/math.ts","../src/index.ts"],"sourcesContent":[],"mappings":";;;UAaiB,cAAA,SAAuB;sBAClB;;EADL,gBAAA,CAAe,EAAA,OAAA;;;;ECXf,CAAA;EAaL;AAEZ;AAMA;;EAKY,cAAA,CAAA,EAAA,SAAA,MAAA,EAAA;EALyB;;AAQrC;AAMA;EAMiB,0BAKR,CAAA,EAAA,OAAA;AAGT;;;UAjDiB,QAAA;;EDWA,GAAA,EAAA,MAAA;;;;ACXjB;AAaA;AAEA;AAMA;;;AAAqC,KARzB,WAAA,GAAc,QAQW,GARA,MAQA,CAAA,MAAA,EAAA,OAAA,CAAA;AAAQ,UAN5B,QAAA,SAAiB,QAMW,CAAA;EAQ5B,IAAA,EAAA,MAAA;EAMA,OAAA,EAAA,MAAW;EAMX,MAAA,CAAA,EAAA,OAAS;AAQ1B;AAKiB,UAjCA,WAAA,SAAoB,QAiCU,CAAA;EAiB9B,IAAA,EAAA,SAAA;EAOA,KAAA,EAAA,MAAA;EAYL,IAAA,EAAA,MAAA;EAYK,KAAA,CAAA,EA7EP,MA6EO,CAAA,MAAA,EAAoB,MAAA,GAAA,OAAA,CAAA;EAK3B,QAAA,EAjFE,UAiFF,EAAA;;AALmC,UAzE5B,aAAA,SAAsB,QAyEM,CAAA;EAAQ,IAAA,EAAA,WAAA;EAUpC,QAAA,EAjFL,UAiFoB,EAAA;EAKf,aAAS,CAAA,EAAA,OAKd;AAGZ;AAOiB,UAjGA,UAAA,SAAmB,QAiGO,CAAQ;EAIlC,IAAA,EAAA,QAAA;EASL,QAAA,EA5GA,UA4Gc,EAAA;EAST,OAAA,CAAA,EAAA,MAAA;AAKjB;AAEU,UAxHO,QAAA,SAAiB,QAwHxB,CAAA;EACF,IAAA,EAAA,MAAA;EAH2B,OAAA,EAAA,OAAA;EAAQ,KAAA,CAAA,EAAA,MAAA;EAM1B,KAAA,EAvHR,YAuHqB,EAAA;AAK9B;AAOiB,UAhIA,YAAA,SAAqB,QAkI7B,CAAA;EAGQ,IAAA,EAAA,WAAA;EAET,QAAA,EArII,UAqIJ,EAAA;;AAFoC,UAhI3B,aAAA,SAAsB,QAgIK,CAAA;EAAQ,IAAA,EAAA,YAAA;EAMnC,QAAA,EAAA,MAAa;EAMb,IAAA,EAAA,MAAA;EAKA,SAAA,CAAA,EAAA,MAAA;EAKA,OAAA,CAAA,EAAA,MAAA;EAOA,OAAA,CAAA,EAAA,OAAA;EAKP,IAAA,CAAA,EAAA,OAAA;EACE,YAAA,CAAA,EAAA,MAAA;EAN8B,WAAA,CAAA,EAAA,MAAA;EAAQ,GAAA,EAAA,MAAA;AASlD;AAKiB,UA1JA,aAAA,SAAsB,QA0JD,CAAA;EAKrB,IAAA,EAAA,YAAA;EAKA,KAAA,CAAA,EAAA,CAAA,MAAA,EAAc,MAAA,CAAA,EAAA,GAEnB,IAAA;EAGK,GAAA,EAAA,MAAA;EAKA,OAAA,EAAA,MAAA;AAKjB;AAKiB,UAjLA,cAAA,SAAuB,QAiLM,CAAA;EAK7B,IAAA,EAAA,aAAA;EAKA,GAAA,CAAA,EAAA,MAAU;EAMV,OAAA,EAAA,MAAA;EAIA,QAAA,EAjML,UAiMoB,EAAA;
|
|
1
|
+
{"version":3,"file":"index.d.ts","names":[],"sources":["../src/factory.ts","../src/types.ts","../src/parser/inline-parsers/index.ts","../src/parser/index.ts","../src/config.ts","../src/findMatchingClose.ts","../src/parser/inline-parsers/fence-parser.ts","../src/plugins/containers.ts","../src/plugins/isMathLike.ts","../src/plugins/math.ts","../src/index.ts"],"sourcesContent":[],"mappings":"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"}
|