Skip to content

自定义扩展

MarkdownRenderer 提供多层扩展点:HTML 属性、代码渲染、操作按钮、插件、自定义渲染器。

customAttrs — 自定义 HTML 属性

给特定元素添加 class / style / data-* 等,支持对象或函数:

ts
const customAttrs = {
  // 对象形式 — 静态属性合并
  h1: { class: 'my-heading', 'data-id': 'title' },
  table: { class: 'my-table' },

  // 函数形式 — 接收 (hastNode, combinedAttrs),返回属性对象
  code: (node, attrs) => ({
    class: attrs.inline ? 'inline-code' : 'block-code',
    'data-lang': attrs.language,
  }),
}
vue
<MarkdownRenderer :markdown="md" :custom-attrs="customAttrs" />

codeXRender — 自定义代码渲染器

按语言注册自定义代码块渲染,可覆盖默认 CodeBlock:

ts
import { h } from 'vue'

const codeXRender = {
  // 自定义内联代码
  inline: (props) => h('span', { class: 'my-inline-code' }, props.raw.content),

  // 自定义特定语言渲染
  python: (props) => h(MyPythonRunner, { code: props.raw.content }),

  // 函数形式(接收完整 props,返回 VNode)
  javascript: (props) => h('div', evaluateJS(props.raw.content)),
}

codeBlockActions — 代码块操作按钮

ts
import type { CodeBlockAction } from '@flowporr/x-markdown-vue'

const codeBlockActions: CodeBlockAction[] = [
  { label: '运行', icon: PlayIcon, onClick: (code) => runCode(code) },
]

remark / rehype 插件

ts
import remarkEmoji from 'remark-emoji'

<MarkdownRenderer :markdown="md" :remark-plugins-ahead="[remarkEmoji]" />
<MarkdownRenderer :markdown="md" :remark-plugins="[myRemarkPlugin]" />

Ahead 在默认插件之前,非 Ahead 在默认插件之后。

自定义渲染器(核心引擎)

createProcessor + render 构建完全自定义的渲染器:

ts
import { createProcessor, render } from '@flowporr/x-markdown-vue'
import { defineComponent } from 'vue'

export default defineComponent({
  props: { markdown: String },
  setup(props) {
    const processor = createProcessor({
      prePlugins: [/* 自定义 remark 插件 */],
      rehypePlugins: [/* 自定义 rehype 插件 */],
    })
    return () => {
      const mdast = processor.parse(props.markdown)
      const hast = processor.runSync(mdast)
      return render(hast, { class: 'my-md' })
    }
  },
})

主题

组件样式走 --js-* 设计 token,暗色模式用 [data-theme-mode='dark'] 选择器:

css
/* 覆盖代码块背景 */
[data-theme-mode='dark'] .x-md-code-block {
  background: var(--js-surface);
}
组件区域使用的 Token
代码块背景var(--js-surface) / var(--js-surface-hover)
代码块边框var(--js-border) / var(--js-border-light)
文字var(--js-text) / --js-text-secondary / --js-text-muted
圆角var(--js-radius-sm) / --js-radius-md
阴影var(--js-shadow-sm) / --js-shadow-md