stream-markdown-parser
Version:
Pure markdown parser and renderer utilities with streaming support - framework agnostic
334 lines (229 loc) • 8.7 kB
Markdown
# stream-markdown-parser
[](https://www.npmjs.com/package/stream-markdown-parser)
[](README.md)
[](https://www.npmjs.com/package/stream-markdown-parser)
[](https://bundlephobia.com/package/stream-markdown-parser)
[](./LICENSE)
纯 JavaScript Markdown 解析器和渲染工具,支持流式处理 - 框架无关。
该包包含从 `stream-markdown-parser` 中提取的核心 Markdown 解析逻辑,使其可以在任何 JavaScript/TypeScript 项目中使用,无需 Vue 依赖。
## 特性
- 🚀 **纯 JavaScript** - 无框架依赖
- 📦 **轻量级** - 最小打包体积
- 🔧 **可扩展** - 基于插件的架构
- 🎯 **类型安全** - 完整的 TypeScript 支持
- ⚡ **高性能** - 性能优化
- 🌊 **流式友好** - 支持渐进式解析
> ℹ️ 自当前版本起我们基于 [`markdown-it-ts`](https://www.npmjs.com/package/markdown-it-ts)(一个 TypeScript 优先的 markdown-it 发行版)进行构建。API 与 markdown-it 保持一致,但内部仅依赖其解析流程,并提供更丰富的 token 类型定义。
## 安装
```bash
pnpm add stream-markdown-parser
# 或
npm install stream-markdown-parser
# 或
yarn add stream-markdown-parser
```
## 使用
### 基础示例
```typescript
import { getMarkdown, parseMarkdownToStructure } from 'stream-markdown-parser'
// 创建一个带有默认插件的 markdown-it-ts 实例
const md = getMarkdown()
// 将 Markdown 解析为流式友好的 AST 结构
const nodes = parseMarkdownToStructure('# Hello World', md)
console.log(nodes)
// [{ type: 'heading', level: 1, children: [...] }]
// 如果仍需 HTML 输出,markdown-it-ts 依旧提供 render()
const html = md.render?.('# Hello World\n\nThis is **bold**.')
```
### 配置数学公式选项
```typescript
import { getMarkdown, setDefaultMathOptions } from 'stream-markdown-parser'
// 设置全局数学公式选项
setDefaultMathOptions({
commands: ['infty', 'perp', 'alpha'],
escapeExclamation: true
})
const md = getMarkdown()
```
### 自定义国际化
```typescript
import { getMarkdown } from 'stream-markdown-parser'
// 使用翻译映射
const md = getMarkdown('editor-1', {
i18n: {
'common.copy': '复制',
}
})
// 或使用翻译函数
const md = getMarkdown('editor-1', {
i18n: (key: string) => translateFunction(key)
})
```
### 使用插件
```typescript
import customPlugin from 'markdown-it-custom-plugin'
import { getMarkdown } from 'stream-markdown-parser'
const md = getMarkdown('editor-1', {
plugin: [
[customPlugin, { /* 选项 */ }]
]
})
```
### 高级:自定义规则
```typescript
import { getMarkdown } from 'stream-markdown-parser'
const md = getMarkdown('editor-1', {
apply: [
(md) => {
// 添加自定义内联规则
md.inline.ruler.before('emphasis', 'custom', (state, silent) => {
// 你的自定义逻辑
return false
})
}
]
})
```
## API
### 主要函数
#### `getMarkdown(msgId?, options?)`
创建一个配置好的 `markdown-it-ts` 实例(与 markdown-it API 兼容)。
**参数:**
- `msgId` (string, 可选): 该实例的唯一标识符。默认值:`editor-${Date.now()}`
- `options` (GetMarkdownOptions, 可选): 配置选项
**选项:**
```typescript
interface GetMarkdownOptions {
// 要使用的 markdown-it / markdown-it-ts 插件数组
plugin?: Array<Plugin | [Plugin, any]>
// 修改 md 实例的函数数组
apply?: Array<(md: MarkdownIt) => void>
// 翻译函数或翻译映射
i18n?: ((key: string) => string) | Record<string, string>
}
```
#### `parseMarkdownToStructure(content, md?, options?)`
将 Markdown 内容解析为结构化节点树。
**参数:**
- `content` (string): 要解析的 Markdown 内容
- `md` (MarkdownItCore, 可选): markdown-it-ts 实例。如果未提供,则使用 `getMarkdown()` 创建
- `options` (ParseOptions, 可选): 带有钩子的解析选项
**返回值:** `ParsedNode[]` - 解析后的节点数组
#### `processTokens(tokens)`
将原始 markdown-it tokens 处理为扁平数组。
#### `parseInlineTokens(tokens, md)`
解析内联 markdown-it-ts tokens。
### 配置函数
#### `setDefaultMathOptions(options)`
设置全局数学公式渲染选项。
**参数:**
- `options` (MathOptions): 数学公式配置选项
```typescript
interface MathOptions {
commands?: readonly string[] // 要转义的 LaTeX 命令
escapeExclamation?: boolean // 转义独立的 '!' (默认: true)
}
```
### 工具函数
#### `isMathLike(content)`
启发式函数,用于检测内容是否类似数学符号。
**参数:**
- `content` (string): 要检查的内容
**返回值:** `boolean`
#### `findMatchingClose(src, startIdx, open, close)`
在字符串中查找匹配的闭合分隔符,处理嵌套对。
**参数:**
- `src` (string): 源字符串
- `startIdx` (number): 开始搜索的索引
- `open` (string): 开启分隔符
- `close` (string): 闭合分隔符
**返回值:** `number` - 匹配闭合的索引,如果未找到则返回 -1
#### `parseFenceToken(token)`
将代码围栏 token 解析为 CodeBlockNode。
**参数:**
- `token` (MarkdownToken): markdown-it token
**返回值:** `CodeBlockNode`
#### `normalizeStandaloneBackslashT(content, options?)`
规范化数学内容中的反斜杠-t 序列。
**参数:**
- `content` (string): 要规范化的内容
- `options` (MathOptions, 可选): 数学选项
**返回值:** `string`
### 插件函数
#### `applyMath(md, options?)`
将数学插件应用到 markdown-it 实例。
**参数:**
- `md` (MarkdownIt): markdown-it 实例
- `options` (MathOptions, 可选): 数学渲染选项
#### `applyContainers(md)`
将容器插件应用到 markdown-it 实例。
**参数:**
- `md` (MarkdownIt): markdown-it 实例
### 常量
#### `KATEX_COMMANDS`
用于转义的常用 KaTeX 命令数组。
#### `TEX_BRACE_COMMANDS`
使用大括号的 TeX 命令数组。
#### `ESCAPED_TEX_BRACE_COMMANDS`
用于正则表达式的 TEX_BRACE_COMMANDS 转义版本。
## 类型
所有 TypeScript 类型都已导出:
```typescript
import type {
// 节点类型
CodeBlockNode,
GetMarkdownOptions,
HeadingNode,
ListItemNode,
ListNode,
MathOptions,
ParagraphNode,
ParsedNode,
ParseOptions,
// ... 更多
} from 'stream-markdown-parser'
```
### 节点类型
解析器导出各种表示不同 Markdown 元素的节点类型:
- `TextNode`, `HeadingNode`, `ParagraphNode`
- `ListNode`, `ListItemNode`
- `CodeBlockNode`, `InlineCodeNode`
- `LinkNode`, `ImageNode`
- `BlockquoteNode`, `TableNode`
- `MathBlockNode`, `MathInlineNode`
- 以及更多...
## 默认插件
该包预配置了以下 markdown-it 插件:
- `markdown-it-sub` - 下标支持(`H~2~O`)
- `markdown-it-sup` - 上标支持(`x^2^`)
- `markdown-it-mark` - 高亮/标记支持(`==highlighted==`)
- `markdown-it-emoji` - Emoji 支持(`:smile:` → 😄)
- `markdown-it-task-checkbox` - 任务列表支持(`- [ ] Todo`)
- `markdown-it-ins` - 插入标签支持(`++inserted++`)
- `markdown-it-footnote` - 脚注支持
- `markdown-it-container` - 自定义容器支持(`::: warning`, `::: tip` 等)
- 数学公式支持 - 使用 `$...$` 和 `$$...$$` 渲染 LaTeX 数学公式
## 框架集成
虽然该包与框架无关,但它被设计为可以无缝配合以下框架使用:
- ✅ **Node.js** - 服务器端渲染
- ✅ **Vue 3** - 配合 `stream-markdown-parser` 使用
- ✅ **React** - 使用解析的节点进行自定义渲染
- ✅ **Vanilla JS** - 直接 HTML 渲染
- ✅ **任何框架** - 解析为 AST 并按需渲染
## 从 `stream-markdown-parser` 迁移
如果你正在从 `stream-markdown-parser` 中的 markdown 工具迁移:
```typescript
import { getMarkdown } from 'stream-markdown-parser'
```
所有 API 保持不变。详见[迁移指南](../../docs/monorepo-migration.md)。
## 性能
- **轻量级**: ~65KB 压缩后(13KB gzipped)
- **快速**: 针对实时解析优化
- **Tree-shakeable**: 只导入你需要的部分
- **零依赖**: 除了 markdown-it 及其插件
## 贡献
欢迎提交 Issues 和 PRs!请阅读[贡献指南](../../AGENTS.md)。
## 许可证
MIT © Simon He
## 相关项目
- [stream-markdown-parser](https://github.com/Simon-He95/vue-markdown-render) - 功能完整的 Vue 3 Markdown 渲染器