Skip to content

XMarkdown 渲染组件 📜

介绍

XMarkdown 这个组件内置了行内代码代码块数学公式函数(行/块)mermaid 图表等基础样式。在这个开发文档中,有一些样式的演示可能不是很好,但是应该不会影响集成的使用。如果有集成或一些使用问题,可以进 👉交流群 获取最新的技术支持。

📌 注意

该组件支持增量更新支持自定义。更多的样式内置和组件的自定义🥰

代码演示

基本使用

快速渲染一个 Markdown 基础的文本。内置了行内代码、代码块、数学公式函数(行/块)、mermaid 图表等基础样式。

📌 注意

支持增量更新,可以在控制台查看节点的更新变化。

覆盖样式

如果你集成该组件时,发现组件内置的样式变的奇怪。可能是你项目的内置全局样式,和这个组件的一些基础样式有冲突。那么你可以通过覆盖样式的方式来解决这个问题。

💌 消息

创建一个样式文件,例如:self-markdown.css,并添加一些自定义样式内容:

css
.h1 {
  font-size: 24px;
  color: red;
  margin-bottom: 16px;
}

将这个文件引入到你的项目,例如:

ts
import 'self-markdown.css'

如果没有覆盖,大概率是因为你设置层级不够,可以尝试样式穿透

github 样式

市场上也有很多优秀的作者,开源了他们的 markdown 样式,这里演示一个集成使用 github 样式的案例。

你可以直接下载 github-markdown.css 这个文件,或者把样式代码复制到自己的 css 文件中。然后在项目中引用。

📌 注意

不过值得注意的是,一般这种文件样式,都是被 markdown-body 类名包住的。光引入样式文件,是不行的。你可能还需要给 XMarkdown 添加一个类名,来让样式生效。这个类名和引入的样式文件中的最外层的类名,应该保持一致。

allowHtml

支持 html 标签渲染,使用 allowHtml 属性开启,默认开启。

enableLatex

支持 latex 数学公式渲染,使用 enableLatex 属性开启,默认开启。

enableBreaks

支持 remark-breaks 渲染,使用 enableBreaks 属性开启,默认开启。

支持硬中断而不需要空格或转义符(将回车符变成 <br>)。让你的内容渲染更加还原。

自定义代码块渲染

使用 codeXRender 属性,自定义代码块的渲染。这个属性接受一个对象,对象中的 key 为代码块的语言,value 为一个函数,函数的参数为代码块的属性,返回值为一个 VNode。意味着你可以用 Vue 的模板语法来渲染代码块。

📌 注意

这个功能会拦截你设置的代码块,你可以和后端商量好码块的语言,然后根据语言返回一个对应的 VNode。

后续我们会打造一个基于这个组件的组件库广场,如果你对此感兴趣,欢迎加入🥰交流群,或者添加作者联系方式,一同打造这个广场项目。🥳敬请期待

自定义代码块顶部渲染

如果你仅仅想修改我们内置的代码块顶部的内容,你可以使用 codeXSlot。并且我们暴露出来了内置的 折叠主题切换复制 方法。你可以在仅改变样式的同时,保留默认功能。

使用 codeXSlot 属性,自定义代码块顶部插槽的渲染。这个属性接受一个对象,对象中的 key 为 CodeBlockHeaderExpose 这个类型的固定的属性,value 为一个函数,函数的参数为代码块的属性,返回值为一个 VNode,意味着你可以用 Vue 的模板语法来渲染代码块的顶部。

你可以在自定义的模版中获取到 props, 并且 props 中有以下属性 (具体属性可以在项目中自行打印查看):

  • toggleExpand: props.toggleExpand 展开代码块。
  • isDark: props.isDark.value 获取当前代码块主题。
  • toggleTheme: props.toggleTheme 切换代码块主题。
  • renderLines: props.renderLines 获取这个代码块的内容,你可以用它来传给复制函数。
  • copyCode: props.copyCode() 复制代码块(需要传参)。

以下是 mermaid 的代码块头部自定义组件 props 中有可以获取的内置属性:

  • zoomIn: props.zoomIn 放大。
  • zoomOut: props.zoomOut 缩小。
  • reset: props.reset 回到初始位置。
  • toggleCode: props.toggleCode 切换显示代码。
  • download: props.download 下载图片。
  • fullscreen: props.fullscreen 进入全屏。
  • copyCode: props.copyCode 复制代码。
ts
// 这个属性的类型定义
interface CodeBlockHeaderExpose {
  // 自定义渲染整个代码块的头部
  codeHeader?: CodeBlockHeaderRenderer;
  // 自定义渲染代码块的左侧语言标识符
  codeHeaderLanguage?: CodeBlockHeaderRenderer;
  // 自定义渲染代码块的右侧控制按钮
  codeHeaderControl?: CodeBlockHeaderRenderer;
  // 自定义渲染 mermaid 顶部插槽
  codeMermaidHeaderControl?: CodeBlockHeaderRenderer;
}

自定义属性

使用 customAttrs 属性,接收一个对象,对象中的属性为标签名,值为标签的属性。匹配一个标签,就会给该标签添加相应的属性。

mermaid 配置

使用 mermaidConfig 属性,自定义mermaid 顶部的 ToolbarConfig 。这个属性接受一个MermaidToolbarConfig 对象, 可以控制顶部控件的隐藏展示,一些类名的添加,还有悬停颜色的控制。

📌 注意

如果你和 code-x-slot 设置了 codeMermaidHeaderControl 属性,则完全接管 mermaid 的 Toolbar 插槽,由开发者完全自定义。当然,我们还是暴露了内置的 Toolbar 方法,你可以仅修改样式的情况下,保留一些内置的你需要的方法。

ts
interface MermaidToolbarConfig {
  showToolbar?: boolean;
  showFullscreen?: boolean;
  showZoomIn?: boolean;
  showZoomOut?: boolean;
  showReset?: boolean;
  showDownload?: boolean;
  toolbarStyle?: Record<string, any>;
  toolbarClass?: string;
  iconColor?: string;
  tabTextColor?: string;
  hoverBackgroundColor?: string;
  tabActiveBackgroundColor?: string;
}

插槽 标签拦截

你可以拦截一些标签,也可以是自定义的标签,然后自定义去渲染这些标签。如果是想自定义渲染图片或者视频,说不定会很方便

属性

属性名类型是否必填默认值描述
markdownstring''markdown 内容
allowHtmlbooltrue是否渲染 html
enableLatexbooltrue是否渲染 latex
enableBreaksbooltrue是否渲染 breaks
codeXRenderObject()=>{}自定义代码块渲染
codeXSlotObject()=>{}自定义代码块顶部插槽渲染
customAttrsObject()=>{}自定义属性
mermaidConfigObject()=>{}mermaid 配置

功能特性

  • 支持增量渲染,极致的性能
  • 支持自定义插槽,可以是 h 函数的组件,也可以是 template 模版组件。上手更简单
  • 内置丰富的基础样式数学公式,mermaid图表,减少开发者负担
  • 支持多种拦截,和自定义渲染,上限拉满