Skip to content

扩展功能

Incremark 的双引擎架构为 micromarkmarked 引擎提供了灵活的扩展机制。

引擎选择

根据你的扩展需求选择合适的引擎:

引擎扩展类型适用场景
micromarkmicromark + mdast 扩展丰富的生态,CommonMark 兼容
marked自定义 Token 转换器极致性能,简单扩展

Micromark 扩展

使用 micromark 引擎时,可以利用丰富的现有扩展生态。

语法扩展

使用 micromark 扩展支持新语法:

vue
<script setup>
import { ref } from 'vue'
import { IncremarkContent } from '@incremark/vue'
import { gfmTable } from 'micromark-extension-gfm-table'

const content = ref('')
const isFinished = ref(false)

// 注意:extensions 选项仅用于 micromark 引擎
// 需要配合 MicromarkAstBuilder 使用
import { MicromarkAstBuilder } from '@incremark/core/engines/micromark'

const parser = createIncremarkParser({
  astBuilder: MicromarkAstBuilder,
  extensions: [gfmTable()]
})
</script>

<template>
  <IncremarkContent 
    :content="content" 
    :is-finished="isFinished"
    :incremark-options="options" 
  />
</template>

AST 扩展

使用 mdast-util-from-markdown 扩展将语法转换为 AST 节点:

ts
import { gfmTableFromMarkdown } from 'mdast-util-gfm-table'

import { MicromarkAstBuilder } from '@incremark/core/engines/micromark'

const parser = createIncremarkParser({
  astBuilder: MicromarkAstBuilder,
  extensions: [gfmTable()],
  mdastExtensions: [gfmTableFromMarkdown()]
})

常用扩展包

包名描述
micromark-extension-gfm完整 GFM 支持
micromark-extension-math数学公式
micromark-extension-directive自定义容器
micromark-extension-frontmatterYAML frontmatter

Marked 扩展

marked 引擎使用自定义扩展系统。Incremark 已经为 marked 扩展了以下功能:

  • 脚注: [^1] 引用和 [^1]: content 定义
  • 数学公式: $inline$$$block$$ 公式
  • 自定义容器: :::type 语法
  • 内联 HTML: 结构化 HTML 元素解析

自定义 Token 转换器

对于 marked 引擎,你可以提供自定义的 Token 转换器:

ts
import type { BlockTokenTransformer, InlineTokenTransformer } from '@incremark/core'

// 自定义块级转换器
const myBlockTransformer: BlockTokenTransformer = (token, ctx) => {
  if (token.type === 'myCustomBlock') {
    return {
      type: 'paragraph',
      children: [{ type: 'text', value: token.raw }]
    }
  }
  return null
}

// 对于 marked 引擎(默认),使用 customBlockTransformers
const parser = createIncremarkParser({
  // marked 是默认引擎,无需指定 astBuilder
  customBlockTransformers: {
    myCustomBlock: myBlockTransformer
  }
})

内置转换器

你可以访问和扩展内置转换器:

ts
import { 
  getBuiltinBlockTransformers, 
  getBuiltinInlineTransformers 
} from '@incremark/core'

// 获取所有内置转换器
const blockTransformers = getBuiltinBlockTransformers()
const inlineTransformers = getBuiltinInlineTransformers()

// 覆盖特定转换器
const customTransformers = {
  ...blockTransformers,
  code: (token, ctx) => {
    // 自定义代码块处理
    return { type: 'code', value: token.text, lang: token.lang }
  }
}

UI 层扩展

除了解析器扩展,Incremark 还提供 UI 层的自定义能力:

自定义组件

替换任意节点类型的默认渲染:

vue
<IncremarkContent 
  :content="content" 
  :is-finished="isFinished"
  :components="{ heading: MyCustomHeading }"
/>

自定义代码块

为特定语言的代码块使用自定义组件:

vue
<IncremarkContent 
  :content="content" 
  :is-finished="isFinished"
  :custom-code-blocks="{ echarts: MyEchartsRenderer }"
  :code-block-configs="{ echarts: { takeOver: true } }"
/>

自定义容器

使用自定义组件渲染 :::type 容器:

vue
<IncremarkContent 
  :content="content" 
  :is-finished="isFinished"
  :custom-containers="{ 
    warning: WarningBox,
    info: InfoBox,
    tip: TipBox 
  }"
/>

扩展最佳实践

  1. 选择合适的引擎: 复杂语法扩展使用 micromark,性能敏感场景使用 marked

  2. 利用现有包: micromark 生态有很多经过充分测试的扩展。

  3. 优先 UI 层扩展: 对于视觉定制,优先使用 UI 层扩展(自定义组件)而非解析器扩展。

  4. 充分测试: 自定义扩展可能影响不同 Markdown 输入的解析行为。