说明书
- 1Markdown 教程
- 2说明书本文
- 3MDX 格式文章示例

在这里,我们将探索如何使用 Expressive Code 展示代码块。提供的示例基于官方文档,您可以参考以获取更多详细信息。
表达性代码
语法高亮
常规语法高亮
console.log('此代码有语法高亮!')渲染 ANSI 转义序列
Standard ANSI colors:- Dimmed: Black Red Green Yellow Blue Magenta Cyan White - Foreground: Black Red Green Yellow Blue Magenta Cyan White - Background: Black Red Green Yellow Blue Magenta Cyan White - Reversed: Black Red Green Yellow Blue Magenta Cyan White
8-bit colors (showing colors 160-171 as an example):- Dimmed: 160 161 162 163 164 165 166 167 168 169 170 171 - Foreground: 160 161 162 163 164 165 166 167 168 169 170 171 - Background: 160 161 162 163 164 165 166 167 168 169 170 171 - Reversed: 160 161 162 163 164 165 166 167 168 169 170 171
24-bit colors (full RGB):- Dimmed: ForestGreen - RGB(34,139,34) RebeccaPurple - RGB(102,51,153) - Foreground: ForestGreen - RGB(34,139,34) RebeccaPurple - RGB(102,51,153) - Background: ForestGreen - RGB(34,139,34) RebeccaPurple - RGB(102,51,153) - Reversed: ForestGreen - RGB(34,139,34) RebeccaPurple - RGB(102,51,153)
Font styles:- Default- Bold- Dimmed- Italic- Underline- Reversed- Strikethrough编辑器和终端框架
代码编辑器框架
console.log('标题属性示例')<div>文件名注释示例</div>终端框架
echo "此终端框架没有标题"Write-Output "这个有标题!"覆盖框架类型
echo "看,没有框架!"# 如果不覆盖,这将是一个终端框架function Watch-Tail { Get-Content -Tail 20 -Wait $args }New-Alias tail Watch-Tail文本和行标记
标记整行和行范围
// 第1行 - 通过行号定位// 第2行// 第3行// 第4行 - 通过行号定位// 第5行// 第6行// 第7行 - 通过范围 "7-8" 定位// 第8行 - 通过范围 "7-8" 定位选择行标记类型 (mark, ins, del)
function demo() { console.log('此行标记为已删除') // 此行和下一行标记为已插入 console.log('这是第二个插入行')
return '此行使用中性默认标记类型'}为行标记添加标签
<button role="button" {...props} value={value} className={buttonClassName} disabled={disabled} active={active}> {children && !active && (typeof children === 'string' ? <span>{children}</span> : children)}</button>在单独行上添加长标签
<button role="button" {...props}
value={value} className={buttonClassName}
disabled={disabled} active={active}>
{children && !active && (typeof children === 'string' ? <span>{children}</span> : children)}</button>使用类似 diff 的语法
此行将标记为已插入此行将标记为已删除这是常规行--- a/README.md+++ b/README.md@@ -1,3 +1,4 @@+this is an actual diff file-all contents will remain unmodified no whitespace will be removed either结合语法高亮和类似 diff 的语法
function thisIsJavaScript() { // 整个块都会以 JavaScript 高亮显示, // 并且我们仍然可以为其添加 diff 标记! console.log('要删除的旧代码') console.log('新的闪亮代码!')}标记行内的单独文本
function demo() { // 标记行内的任何给定文本 return '支持给定文本的多个匹配项';}正则表达式
console.log('单词 yes 和 yep 将被标记。')转义正斜杠
echo "Test" > /home/test.txt选择内联标记类型 (mark, ins, del)
function demo() { console.log('这些是插入和删除的标记类型'); // return 语句使用默认标记类型 return true;}自动换行
为每个块配置自动换行
// 启用换行的示例function getLongString() { return '这是一个非常长的字符串,除非容器极宽,否则很可能无法适应可用空间'}// wrap=false 的示例function getLongString() { return '这是一个非常长的字符串,除非容器极宽,否则很可能无法适应可用空间'}配置换行的缩进
// preserveIndent 示例(默认启用)function getLongString() { return '这是一个非常长的字符串,除非容器极宽,否则很可能无法适应可用空间'}// preserveIndent=false 的示例function getLongString() { return '这是一个非常长的字符串,除非容器极宽,否则很可能无法适应可用空间'}可折叠部分
5 collapsed lines
// 所有这些样板设置代码将被折叠import { someBoilerplateEngine } from '@example/some-boilerplate'import { evenMoreBoilerplate } from '@example/even-more-boilerplate'
const engine = someBoilerplateEngine(evenMoreBoilerplate())
// 这部分代码默认可见engine.doSomething(1, 2, 3, calcFn)
function calcFn() { // 您可以有多个折叠部分3 collapsed lines
const a = 1 const b = 2 const c = a + b
// 这将保持可见 console.log(`计算结果: ${a} + ${b} = ${c}`) return c}
4 collapsed lines
// 直到块末尾的所有代码将再次被折叠engine.closeConnection()engine.freeMemory()engine.shutdown({ reason: '示例样板代码结束' })行号
为每个块显示行号
// 此代码块将显示行号console.log('来自第2行的问候!')console.log('我在第3行')// 此块禁用行号console.log('你好?')console.log('抱歉,你知道我在第几行吗?')更改起始行号
console.log('来自第5行的问候!')console.log('我在第6行')Tab 代码块
由 rehype-code-group 提供,语法与 VitePress 代码组 一致:用 ::: code-group labels=[...] 包裹多个代码块,即可合并成一组标签页。
labels=[...] 中的标签按顺序对应组内的代码块,用英文逗号分隔;::: 与 code-group 之间的空格不能省略。
基本用法
::: code-group labels=[code.js, code.py, code.html]
```jsexport function greet(name) { return `Hello, ${name}!`;}```
```pydef greet(name): return f"Hello, {name}!"```
```html<p>Hello, world!</p>```
:::渲染效果:
export function greet(name) { return `Hello, ${name}!`;}def greet(name): return f"Hello, {name}!"<p>Hello, world!</p>标签中使用 Emoji
标签支持 emoji 短代码,构建时会自动转换成 emoji:
::: code-group labels=[:package: npm, :package: pnpm, :yarn: yarn]npm create astro@latestpnpm create astro@latestyarn create astro与其他代码块特性组合
组内仍是普通的 Expressive Code 代码块,标题、行号、行标记、折叠、终端框架等特性都可以照常使用。
export default { theme: "firefly", codeGroup: true,};pnpm build && pnpm preview3 collapsed lines
// 这三行默认折叠import { a } from "a";import { b } from "b";
console.log(a, b);不止是代码块
标签页内可以放任意内容,例如文字、列表或图片:
这是一段普通的段落内容。
- 列表项一
- 列表项二
标签栏在构建期生成,默认展开第一项;支持鼠标点击与键盘 ← / → / Home / End 切换。
在提醒框内使用(MDX 组件)
::: code-group 和 ::: tip 等 Docusaurus 风格提醒框都使用 ::: 容器语法,而 micromark-directive 规定父子容器的冒号数必须不同,因此 ::: code-group 无法嵌套在 ::: tip 等提醒框内(整块会失效)。
这种情况改用 MDX 组件 TabGroup:MDX 组件不经过 ::: 指令解析,在提醒框内外都能正常使用,也方便日后扩展更多 UI 组件。把文章后缀改为 .mdx,从统一入口 @/components/firefly-mdx 引入(可一次引入多个组件):
import { TabGroup } from "@/components/firefly-mdx";
:::tip
<TabGroup labels={["test.js", "test.py"]} client:load> ```js console.log(1) ```
```py print("hello world") ```</TabGroup>
:::labels数组给每个代码块声明标签,顺序一一对应- 组件用
client:load激活标签切换
GitHub 仓库卡片
您可以添加链接到 GitHub 仓库的动态卡片,在页面加载时,仓库信息会从 GitHub API 获取。
使用代码 ::github{repo="CuteLeaf/Firefly"} 创建 GitHub 仓库卡片。
::github{repo="CuteLeaf/Firefly"}提醒框(Admonitions)配置
Firefly 采用了 rehype-callouts 插件,支持了四种风格的提醒框主题:GitHub、Obsidian、VitePress 和 Docusaurus。您可以在 src/config/siteConfig.ts 中进行配置:
export const siteConfig: SiteConfig = { // ... rehypeCallouts: { // 选项: "github" | "obsidian" | "vitepress" | "docusaurus" theme: "github", }, // ...};注意:更改配置后需要重启开发服务器才能生效。
以下是各个主题支持的类型列表,每个主题风格和语法不同,可根据喜好选择。
1. GitHub 主题风格
这是 GitHub 官方支持的 5 种基本类型。

基本语法
> [!NOTE] NOTE> 突出显示用户应该考虑的信息。
> [!TIP] TIP> 可选信息,帮助用户更成功。
> [!IMPORTANT] IMPORTANT> 用户成功所必需的关键信息。
> [!WARNING] WARNING> 关键内容,需要立即注意。
> [!CAUTION] CAUTION> 行动的负面潜在后果。
> [!NOTE] 自定义标题> 这是一个带有自定义标题的示例。2. Obsidian 主题风格
Obsidian 风格支持非常丰富的类型和别名。
点击展开 Obsidian 语法列表
> [!NOTE] NOTE> 通用的笔记块。
> [!ABSTRACT] ABSTRACT> 文章的摘要。
> [!SUMMARY] SUMMARY> 文章的总结(同 Abstract)。
> [!TLDR] TLDR> 太长不看(同 Abstract)。
> [!INFO] INFO> 提供额外信息。
> [!TODO] TODO> 需要完成的事项。
> [!TIP] TIP> 实用技巧或提示。
> [!HINT] HINT> 暗示(同 Tip)。
> [!IMPORTANT] IMPORTANT> 重要信息(Obsidian 风格通常使用类似的图标)。
> [!SUCCESS] SUCCESS> 操作成功。
> [!CHECK] CHECK> 检查通过(同 Success)。
> [!DONE] DONE> 已完成(同 Success)。
> [!QUESTION] QUESTION> 提出问题。
> [!HELP] HELP> 寻求帮助(同 Question)。
> [!FAQ] FAQ> 常见问题(同 Question)。
> [!WARNING] WARNING> 警告信息。
> [!CAUTION] CAUTION> 注意事项(同 Warning)。
> [!ATTENTION] ATTENTION> 引起注意(同 Warning)。
> [!FAILURE] FAILURE> 操作失败。
> [!FAIL] FAIL> 失败(同 Failure)。
> [!MISSING] MISSING> 缺失内容(同 Failure)。
> [!DANGER] DANGER> 危险操作警告。
> [!ERROR] ERROR> 错误信息(同 Danger)。
> [!BUG] BUG> 报告软件缺陷。
> [!EXAMPLE] EXAMPLE> 展示一个例子。
> [!QUOTE] QUOTE> 引用一段话。
> [!CITE] CITE> 引证(同 Quote)。
> [!NOTE] 自定义标题> 这是一个带有自定义标题的示例。
3. VitePress 主题风格
VitePress 风格提供了一套现代化的、扁平的默认样式。目前仅包含与 GitHub 一致的 5 种 基础类型。
点击展开 VitePress 语法列表
> [!NOTE] NOTE> 对应 GitHub 的 Note。
> [!TIP] TIP> 对应 GitHub 的 Tip。
> [!IMPORTANT] IMPORTANT> 对应 GitHub 的 Important。
> [!WARNING] WARNING> 对应 GitHub 的 Warning。
> [!CAUTION] CAUTION> 对应 GitHub 的 Caution。
> [!TIP] 自定义标题> VitePress 风格同样支持自定义标题。
4. Docusaurus 主题风格
Docusaurus 风格提供了一套现代化的提醒框样式,支持 5 种类型。
点击展开 Docusaurus 语法列表
支持以下类型的提醒框:note tip info warning danger
:::note突出显示用户应该考虑的信息,即使在快速浏览时也是如此。:::
:::tip可选信息,帮助用户更成功。:::
:::info一般信息。:::
:::warning由于潜在风险需要用户立即注意的关键内容。:::
:::danger行动的负面潜在后果。:::
:::tip[自定义标题]可选信息,帮助用户更成功。:::
剧透
您可以为文本添加剧透。文本也支持 Markdown 语法。
内容
内容 :spoiler[被隐藏了 **哈哈**]!图片画廊网格 (Image Grid)
您可以使用 [grid] 和 [/grid] 标签将多张图片纵向并排展示。这对于展示照片画廊或对比图非常有用。系统会自动根据包裹在其中的图片数量(最多支持并排展示4张)以响应式网格进行布局。
自动补齐图片高度: 同一排中如果有高度、大小或者比例不一的图片,会像「九宫格画廊相册」一样自动撑满。较短或不协调的图片会自动使用 object-cover 进行完美中心裁剪补充视野。图片边框水平彻底对齐无缝隙,但被裁剪后,只有点击图片通过灯箱才能查看完整图片,所以建议尽量避免使用长宽比例不一致的图片在同一排中。
图注恒定底端对齐: 不论上面的图片长宽如何变化,在同一行的所有图像解释文字(图注)都会对标到一条完美的水平基线上了。



基本语法
[grid][/grid]Markdown 中 PlantUML 图表指南
PlantUML 是一种使用纯文本描述图表的工具。你只需要写一段结构化语法,就可以生成时序图、类图、用例图、活动图等常见工程图。
它特别适合写在技术博客和项目文档里:
- 图表和正文一起版本管理,便于协作与审阅
- 修改图只需要改文本,适合频繁迭代
- 能和 Markdown 无缝结合,保持文档统一
在 Firefly 中,plantuml 代码块会在构建阶段编码并生成服务器 SVG 地址,页面端再根据亮暗主题自动切换图源,并支持缩放、拖拽和全屏交互。
如果你想快速上手,可以记住这个最小模板:
活动图示例
状态图示例
用例图示例
组件图示例
部署图示例
ER 图示例
时序图示例(登录与刷新令牌)
C4 风格容器图示例
Markdown 中 Mermaid 图表完整指南
本文演示如何在 Markdown 文档中使用 Mermaid 创建各种复杂图表,包括流程图、时序图、ER 图、类图、状态图、XY 图、甘特图、思维导图等。
Mermaid 图表由 Merman 实现。Firefly 在 Astro 构建阶段生成亮色和深色两套静态 SVG,无需在浏览器中加载 Mermaid 渲染运行时。可以前往 Merman Playground 实时编辑语法并预览渲染结果。
流程图示例
流程图非常适合表示流程或算法步骤。
时序图示例
时序图显示对象之间随时间的交互。
ER 图示例
ER 图(实体关系图)非常适合表示数据库结构。
类图示例
类图显示系统的静态结构,包括类、属性、方法及其关系。
状态图示例
状态图显示对象在其生命周期中经历的状态序列。
XY 图示例
XY 图表非常适合展示趋势和对比数据。
饼图示例
饼图适合直观展示各部分在整体中的占比。
甘特图示例
甘特图可以按时间轴展示项目阶段、任务依赖和当前进度。
思维导图示例
思维导图适合梳理主题层级和知识结构。
时间线示例
时间线用于按年份或阶段呈现项目的重要事件。
用户旅程图示例
用户旅程图能够描述用户在不同阶段的行为和体验评分。
Git 图示例
Git 图可以清晰展示分支、提交和合并历史。
看板示例
看板适合展示任务在不同工作阶段之间的分布。
Sankey 图示例
Sankey 图通过连线宽度展示流量在不同节点之间的流向。
总结
Mermaid 是在 Markdown 文档中创建各种类型图表的强大工具。本文演示了流程图、时序图、ER 图、类图、状态图、XY 图、饼图、甘特图、思维导图、时间线、用户旅程图、Git 图、看板和 Sankey 图。这些图表可以帮助您更清晰地表达复杂的概念、流程和数据结构。
要使用 Mermaid,只需在代码块中指定 mermaid 语言,并使用简洁的文本语法描述图表。图表会在构建时自动渲染为 SVG,无需客户端 JavaScript 加载。
可以前往 Merman Playground 尝试更多语法,再将图表代码粘贴到文章中。
行内公式 (Inline)
行内公式使用单个 $ 符号包裹。
例如:欧拉公式 是数学中最优美的公式之一。
质能方程 也是家喻户晓。
块级公式 (Block)
块级公式使用两个 $$ 符号包裹,会居中显示。
复杂示例
矩阵 (Matrices)
极限与求和 (Limits and Sums)
麦克斯韦方程组 (Maxwell’s Equations)
化学方程式 (Chemical Equations)
更多符号
| 符号 | 代码 | 渲染结果 |
|---|---|---|
| Alpha | \alpha | |
| Beta | \beta | |
| Gamma | \Gamma | |
| Pi | \pi | |
| Infinity | \infty | |
| Right Arrow | \rightarrow | |
| Partial | \partial |
更多 KaTeX 语法请参考 KaTeX Supported Functions。
支持与分享
如果这篇文章对你有帮助,欢迎分享给更多人或打赏支持!









































