Markdown 完全教程

8158 字
41 分钟
Markdown 完全教程

本文汇总了写博客时最常用的语法:从最基础的 Markdown 排版,到 Firefly 支持的代码块、数学公式、Mermaid / PlantUML 图表、视频嵌入等扩展功能,都放在这一篇里,方便以后写文章时直接搜索查阅。

Markdown 基础语法#

这是一个展示如何编写 Markdown 文件的示例。本文档汇总了核心语法与常见扩展(GFM)。

块级元素#

段落与换行#

段落#

HTML 标签:<p>

使用一个或多个空行分隔段落。(仅包含空格制表符的行也视为空行。)

代码:

This will be
inline.
This is second paragraph.

预览:

This will be inline.

This is second paragraph.

换行#

HTML 标签:<br />

在行末添加两个或更多空格来产生换行。

代码:

This will be not
inline.

预览:

This will be not
inline.

标题#

Markdown 支持两种标题样式:Setext 与 atx。

Setext#

HTML 标签:<h1><h2>

使用等号 (=) 表示 <h1>、使用短横线 (-) 表示 <h2>,数量不限,作为“下划线”。

代码:

This is an H1
=============
This is an H2
-------------

预览:

This is an H1#

This is an H2#

atx#

HTML 标签:<h1><h2><h3><h4><h5><h6>

在行首使用 1-6 个井号 (#),对应 <h1><h6>

代码:

# This is an H1
## This is an H2
###### This is an H6

预览:

This is an H1#

This is an H2#

####### This is an H6

可选:你可以在行尾“闭合” atx 标题。末尾的井号数量不必与开头一致。

代码:

# This is an H1 #
## This is an H2 ##
### This is an H3 ######

预览:

This is an H1#

This is an H2#

This is an H3#

引用#

HTML 标签:<blockquote>

Markdown 使用邮件风格的 > 作为引用符号。若手动换行并在每行前加 >,显示效果最佳。

代码:

> This is a blockquote with two paragraphs. Lorem ipsum dolor sit amet,
> consectetuer adipiscing elit. Aliquam hendrerit mi posuere lectus.
> Vestibulum enim wisi, viverra nec, fringilla in, laoreet vitae, risus.
>
> Donec sit amet nisl. Aliquam semper ipsum sit amet velit. Suspendisse
> id sem consectetuer libero luctus adipiscing.

预览:

This is a blockquote with two paragraphs. Lorem ipsum dolor sit amet, consectetuer adipiscing elit. Aliquam hendrerit mi posuere lectus. Vestibulum enim wisi, viverra nec, fringilla in, laoreet vitae, risus.

Donec sit amet nisl. Aliquam semper ipsum sit amet velit. Suspendisse id sem consectetuer libero luctus adipiscing.

Markdown 允许“偷懒”:在一个硬换行段落中,只在第一行前加 > 即可。

代码:

> This is a blockquote with two paragraphs. Lorem ipsum dolor sit amet,
consectetuer adipiscing elit. Aliquam hendrerit mi posuere lectus.
Vestibulum enim wisi, viverra nec, fringilla in, laoreet vitae, risus.
> Donec sit amet nisl. Aliquam semper ipsum sit amet velit. Suspendisse
id sem consectetuer libero luctus adipiscing.

预览:

This is a blockquote with two paragraphs. Lorem ipsum dolor sit amet, consectetuer adipiscing elit. Aliquam hendrerit mi posuere lectus. Vestibulum enim wisi, viverra nec, fringilla in, laoreet vitae, risus.

Donec sit amet nisl. Aliquam semper ipsum sit amet velit. Suspendisse id sem consectetuer libero luctus adipiscing.

引用可以嵌套(引用中的引用),通过增加 > 层级实现。

代码:

> This is the first level of quoting.
>
> > This is nested blockquote.
>
> Back to the first level.

预览:

This is the first level of quoting.

This is nested blockquote.

Back to the first level.

引用内可包含其他 Markdown 元素,包括标题、列表与代码块。

代码:

> ## This is a header.
>
> 1. This is the first list item.
> 2. This is the second list item.
>
> Here's some example code:
>
> return shell_exec("echo $input | $markdown_script");

预览:

This is a header.#

  1. This is the first list item.
  2. This is the second list item.

Here’s some example code:

return shell_exec("echo $input | $markdown_script");

列表#

Markdown 支持有序(数字)与无序(圆点)列表。

无序列表#

HTML 标签:<ul>

无序列表可使用 星号 (*)加号 (+)短横线 (-)

代码:

* Red
* Green
* Blue

预览:

  • Red
  • Green
  • Blue

等价于:

代码:

+ Red
+ Green
+ Blue

或者:

代码:

- Red
- Green
- Blue
有序列表#

HTML 标签:<ol>

有序列表使用数字加英文句点:

代码:

1. Bird
2. McHale
3. Parish

预览:

  1. Bird
  2. McHale
  3. Parish

注意:像下面这样可能会“意外触发”有序列表:

代码:

1986. What a great season.

预览:

  1. What a great season.

你可以用反斜杠转义 (\) 句点:

代码:

1986\. What a great season.

预览:

1986. What a great season.

列表中的缩进内容#
列表项里的引用#

在列表项内放置引用,需要将 > 符号整体缩进:

代码:

* A list item with a blockquote:
> This is a blockquote
> inside a list item.

预览:

  • A list item with a blockquote:

    This is a blockquote inside a list item.

列表项里的代码块#

在列表项内放置代码块,需要缩进两层——8 个空格两个 Tab

代码:

* A list item with a code block:
<code goes here>

预览:

  • A list item with a code block:

    <code goes here>
嵌套列表#

代码:

* A
* A1
* A2
* B
* C

预览:

  • A
    • A1
    • A2
  • B
  • C

代码块#

HTML 标签:<pre>

将代码块中的每行缩进至少4 个空格1 个制表符

代码:

This is a normal paragraph:
This is a code block.

预览:

This is a normal paragraph:

This is a code block.

代码块会一直持续,直到遇到未缩进的行(或文末)。

在代码块内,与号 (&) 和尖括号 (< >) 会自动转为 HTML 实体。

代码:

<div class="footer">
&copy; 2004 Foo Corporation
</div>

预览:

<div class="footer">
&copy; 2004 Foo Corporation
</div>

下文的“围栏代码块”和“语法高亮”属于扩展语法,你也可以用它们来书写代码块。

围栏代码块#

使用成对的反引号围起来(如下所示),就不需要四空格缩进了。

代码:

Here's an example:
```
function test() {
console.log("notice the blank line before this function?");
}
```

预览:

Here’s an example:

function test() {
console.log("notice the blank line before this function?");
}
语法高亮#

在围栏代码块后添加可选的语言标识,即可启用语法高亮(参见支持语言列表)。

代码:

```ruby
require 'redcarpet'
markdown = Redcarpet.new("Hello World!")
puts markdown.to_html
```

预览:

require 'redcarpet'
markdown = Redcarpet.new("Hello World!")
puts markdown.to_html

分割线(水平线)#

HTML 标签:<hr /> 一行中放置三个或以上的短横线 (-)、星号 (*) 或下划线 (_)。符号之间允许有空格。

代码:

* * *
***
*****
- - -
---------------------------------------
___

预览:

表格#

HTML 标签:<table>

这是扩展语法。

竖线 (|) 分隔列,用短横线 (-) 分隔表头,使用冒号 (:) 指定对齐方式。

两侧的竖线 (|) 与对齐可选。用于表头分隔时,每列至少需要 3 个短横线

代码:

| Left | Center | Right |
|:-----|:------:|------:|
|aaa |bbb |ccc |
|ddd |eee |fff |
A | B
---|---
123|456
A |B
--|--
12|45

预览:

LeftCenterRight
aaabbbccc
dddeeefff
AB
123456
AB
1245

内联元素#

链接#

HTML 标签:<a>

Markdown 支持两种链接样式:行内链接与引用式链接。

行内链接#

行内链接格式:[文本](URL "标题")

标题可选。

代码:

This is [an example](http://example.com/ "Title") inline link.
[This link](http://example.net/) has no title attribute.

预览:

This is an example inline link.

This link has no title attribute.

如果引用同一站点的本地资源,可以使用相对路径:

代码:

See my [About](/about/) page for details.

预览:

See my About page for details.

引用式链接#

可以预定义链接引用。定义格式:[id]: URL "标题"

标题同样可选。引用时使用:[文本][id]

代码:

[id]: http://example.com/ "Optional Title Here"
This is [an example][id] reference-style link.

预览:

This is an example reference-style link.

说明:

  • 方括号中包含链接标识(不区分大小写,可在左侧缩进最多三格空格);
  • 随后是冒号;
  • 再跟一个或多个空格(或 tab);
  • 然后是链接 URL;
  • URL 可选地用尖括号包裹;
  • 可选地跟随标题属性,用引号或圆括号包裹。

以下三种定义等价:

代码:

[foo]: http://example.com/ "Optional Title Here"
[foo]: http://example.com/ 'Optional Title Here'
[foo]: http://example.com/ (Optional Title Here)
[foo]: <http://example.com/> "Optional Title Here"

如果使用空的方括号,则链接文本本身会作为名称。

代码:

[Google]: http://google.com/
[Google][]

预览:

Google

强调#

HTML 标签:<em><strong>

Markdown 使用 星号 (*)下划线 (_) 表示强调。一个分隔符对应 <em>两个分隔符对应 <strong>

代码:

*single asterisks*
_single underscores_
**double asterisks**
__double underscores__

预览:

single asterisks

single underscores

double asterisks

double underscores

但如果两侧有空格,则会被视作普通字符而非强调语法。

你可以使用反斜杠进行转义:

代码:

\*this text is surrounded by literal asterisks\*

预览:

*this text is surrounded by literal asterisks*

行内代码#

HTML 标签:<code>

反引号 (`) 包裹。

代码:

Use the `printf()` function.

预览:

Use the printf() function.

若行内代码中需要包含反引号字符,可使用多重反引号作为定界符:

代码:

``There is a literal backtick (`) here.``

预览:

There is a literal backtick (`) here.

行内代码两侧的定界符允许包含空格(开头一个、结尾一个),方便在代码起始或结尾放置反引号字符:

代码:

A single backtick in a code span: `` ` ``
A backtick-delimited string in a code span: `` `foo` ``

预览:

A single backtick in a code span: `

A backtick-delimited string in a code span: `foo`

图片#

HTML 标签:<img />

Markdown 的图片语法与链接类似,支持行内与引用两种方式。

行内图片#

行内图片语法:![替代文本](URL "标题")

标题可选。

代码:

![Alt text](/path/to/img.jpg)
![Alt text](/path/to/img.jpg "Optional title")

预览:

Alt text
Alt text

Alt text
Alt text

说明:

  • 一个感叹号 !;
  • 后接方括号,放置图片的替代文本;
  • 再接圆括号,内含图片 URL/路径,及可选的标题(引号包裹)。
引用式图片#

引用式图片语法:![替代文本][id]

代码:

[img id]: https://s2.loli.net/2024/08/20/5fszgXeOxmL3Wdv.webp "Optional title attribute"
![Alt text][img id]

预览:

Alt text
Alt text

删除线#

HTML 标签:<del>

这是扩展语法。

GFM 增加了删除线语法。

代码:

~~Mistaken text.~~

预览:

Mistaken text.

杂项#

自动链接#

Markdown 支持一种便捷写法来创建“自动链接”(URL 与邮箱地址):只需用尖括号将其包住即可。

代码:

<http://example.com/>
<address@example.com>

预览:

http://example.com/

address@example.com

GFM 会自动识别标准 URL 并转换为链接。

代码:

https://github.com/emn178/markdown

预览:

https://github.com/emn178/markdown

反斜杠转义#

Markdown 允许使用反斜杠来转义那些本用于 Markdown 语法的特殊字符,使其按字面显示。

代码:

\*literal asterisks\*

预览:

*literal asterisks*

以下字符可通过反斜杠转义以按字面量输出:

Code:

\ backslash
` backtick
* asterisk
_ underscore
{} curly braces
[] square brackets
() parentheses
# hash mark
+ plus sign
- minus sign (hyphen)
. dot
! exclamation mark

内联 HTML#

对于 Markdown 语法未覆盖的标记,直接使用原生 HTML 即可。无需特别声明从 Markdown 切换到 HTML,直接写标签就行。

代码:

This is a regular paragraph.
<table>
<tr>
<td>Foo</td>
</tr>
</table>
This is another regular paragraph.

预览:

This is a regular paragraph.

Foo

This is another regular paragraph.

请注意:在块级 HTML 标签内不会处理 Markdown 语法。

与块级标签不同,在行内级标签内会处理 Markdown 语法。

代码:

<span>**Work**</span>
<div>
**No Work**
</div>

预览:

Work

**No Work**
***

扩展功能#

GitHub 仓库卡片#

您可以添加链接到 GitHub 仓库的动态卡片,在页面加载时,仓库信息会从 GitHub API 获取。

CuteLeaf
/
Firefly
Waiting for api.github.com...
00K
0K
0K
Waiting...

使用代码 ::github{repo="CuteLeaf/Firefly"} 创建 GitHub 仓库卡片。

::github{repo="CuteLeaf/Firefly"}

提醒框(Admonitions)配置#

Firefly 采用了 rehype-callouts 插件,支持了四种风格的提醒框主题:GitHubObsidianVitePressDocusaurus。您可以在 src/config/siteConfig.ts 中进行配置:

src/config/siteConfig.ts
export const siteConfig: SiteConfig = {
// ...
rehypeCallouts: {
// 选项: "github" | "obsidian" | "vitepress" | "docusaurus"
theme: "github",
},
// ...
};

注意:更改配置后需要重启开发服务器才能生效。

以下是各个主题支持的类型列表,每个主题风格和语法不同,可根据喜好选择。

1. GitHub 主题风格#

这是 GitHub 官方支持的 5 种基本类型。

GitHub
GitHub

基本语法

> [!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] 自定义标题
> 这是一个带有自定义标题的示例。

Obsidian
Obsidian

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 风格同样支持自定义标题。

VitePress
VitePress

4. Docusaurus 主题风格#

Docusaurus 风格提供了一套现代化的提醒框样式,支持 5 种类型。

点击展开 Docusaurus 语法列表

支持以下类型的提醒框:note tip info warning danger

:::note
突出显示用户应该考虑的信息,即使在快速浏览时也是如此。
:::
:::tip
可选信息,帮助用户更成功。
:::
:::info
一般信息。
:::
:::warning
由于潜在风险需要用户立即注意的关键内容。
:::
:::danger
行动的负面潜在后果。
:::
:::tip[自定义标题]
可选信息,帮助用户更成功。
:::

Docusaurus
Docusaurus

剧透#

您可以为文本添加剧透。文本也支持 Markdown 语法。

内容 被隐藏了 哈哈

内容 :spoiler[被隐藏了 **哈哈**]!

图片画廊网格 (Image Grid)#

您可以使用 [grid][/grid] 标签将多张图片纵向并排展示。这对于展示照片画廊或对比图非常有用。系统会自动根据包裹在其中的图片数量(最多支持并排展示4张)以响应式网格进行布局。

自动补齐图片高度: 同一排中如果有高度、大小或者比例不一的图片,会像「九宫格画廊相册」一样自动撑满。较短或不协调的图片会自动使用 object-cover 进行完美中心裁剪补充视野。图片边框水平彻底对齐无缝隙,但被裁剪后,只有点击图片通过灯箱才能查看完整图片,所以建议尽量避免使用长宽比例不一致的图片在同一排中。

图注恒定底端对齐: 不论上面的图片长宽如何变化,在同一行的所有图像解释文字(图注)都会对标到一条完美的水平基线上了。

示例图片一
示例图片一
示例图片二
示例图片二
示例图片二
示例图片二

基本语法

[grid]
![示例图片一](./images/firefly1.avif)
![示例图片二](./images/firefly2.avif)
![示例图片二](./images/firefly3.avif)
[/grid]

代码块与语法高亮#

在这里,我们将探索如何使用 Expressive Code 展示代码块。提供的示例基于官方文档,您可以参考以获取更多详细信息。

表达性代码#

语法高亮#

语法高亮

常规语法高亮#
console.log('此代码有语法高亮!')
渲染 ANSI 转义序列#
Terminal window
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

编辑器和终端框架#

编辑器和终端框架

代码编辑器框架#
my-test-file.js
console.log('标题属性示例')
src/content/index.html
<div>文件名注释示例</div>
终端框架#
Terminal window
echo "此终端框架没有标题"
PowerShell 终端示例
Write-Output "这个有标题!"
覆盖框架类型#
echo "看,没有框架!"
PowerShell Profile.ps1
## 如果不覆盖,这将是一个终端框架
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)#
line-markers.js
function demo() {
console.log('此行标记为已删除')
// 此行和下一行标记为已插入
console.log('这是第二个插入行')
return '此行使用中性默认标记类型'
}
为行标记添加标签#
labeled-line-markers.jsx
<button
role="button"
{...props}
value={value}
className={buttonClassName}
disabled={disabled}
active={active}
>
{children &&
!active &&
(typeof children === 'string' ? <span>{children}</span> : children)}
</button>
在单独行上添加长标签#
labeled-line-markers.jsx
<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('单词 yesyep 将被标记。')
转义正斜杠#
Terminal window
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=[...] 包裹多个代码块,即可合并成一组标签页。

Note

labels=[...] 中的标签按顺序对应组内的代码块,用英文逗号分隔;:::code-group 之间的空格不能省略。

基本用法#

::: code-group labels=[code.js, code.py, code.html]
```js
export function greet(name) {
return `Hello, ${name}!`;
}
```
```py
def greet(name):
return f"Hello, {name}!"
```
```html
<p>Hello, world!</p>
```
:::

渲染效果:

export function greet(name) {
return `Hello, ${name}!`;
}

标签中使用 Emoji#

标签支持 emoji 短代码,构建时会自动转换成 emoji:

::: code-group labels=[:package: npm, :package: pnpm, :yarn: yarn]
Terminal window
npm create astro@latest

与其他代码块特性组合#

组内仍是普通的 Expressive Code 代码块,标题、行号、行标记、折叠、终端框架等特性都可以照常使用。

astro.config.mjs
export default {
theme: "firefly",
codeGroup: true,
};

不止是代码块#

标签页内可以放任意内容,例如文字、列表或图片:

这是一段普通的段落内容。

Tip

标签栏在构建期生成,默认展开第一项;支持鼠标点击与键盘 / / Home / End 切换。

KaTeX 数学公式#

本文展示了 Firefly 主题对 KaTeX 数学公式的渲染支持。

行内公式 (Inline)#

行内公式使用单个 $ 符号包裹。

例如:欧拉公式 eiπ+1=0e^{i\pi} + 1 = 0 是数学中最优美的公式之一。

质能方程 E=mc2E = mc^2 也是家喻户晓。

块级公式 (Block)#

块级公式使用两个 $$ 符号包裹,会居中显示。

ex2dx=π\int_{-\infty}^{\infty} e^{-x^2} dx = \sqrt{\pi}x=b±b24ac2ax = \frac{-b \pm \sqrt{b^2 - 4ac}}{2a}

复杂示例#

矩阵 (Matrices)#

(abcd)(αβγδ)=(aα+bγaβ+bδcα+dγcβ+dδ)\begin{pmatrix} a & b \\ c & d \end{pmatrix} \begin{pmatrix} \alpha & \beta \\ \gamma & \delta \end{pmatrix} = \begin{pmatrix} a\alpha + b\gamma & a\beta + b\delta \\ c\alpha + d\gamma & c\beta + d\delta \end{pmatrix}

极限与求和 (Limits and Sums)#

n=11n2=π26\sum_{n=1}^{\infty} \frac{1}{n^2} = \frac{\pi^2}{6}limx0sinxx=1\lim_{x \to 0} \frac{\sin x}{x} = 1

麦克斯韦方程组 (Maxwell’s Equations)#

E=ρε0B=0×E=Bt×B=μ0J+μ0ε0Et\begin{aligned} \nabla \cdot \mathbf{E} &= \frac{\rho}{\varepsilon_0} \\ \nabla \cdot \mathbf{B} &= 0 \\ \nabla \times \mathbf{E} &= -\frac{\partial \mathbf{B}}{\partial t} \\ \nabla \times \mathbf{B} &= \mu_0\mathbf{J} + \mu_0\varepsilon_0\frac{\partial \mathbf{E}}{\partial t} \end{aligned}

化学方程式 (Chemical Equations)#

\ceCH4+2O2>CO2+2H2O\ce{CH4 + 2O2 -> CO2 + 2H2O}

更多符号#

符号代码渲染结果
Alpha\alphaα\alpha
Beta\betaβ\beta
Gamma\GammaΓ\Gamma
Pi\piπ\pi
Infinity\infty\infty
Right Arrow\rightarrow\rightarrow
Partial\partial\partial

更多 KaTeX 语法请参考 KaTeX Supported Functions

图表#

Markdown 中 Mermaid 图表完整指南#

本文演示如何在 Markdown 文档中使用 Mermaid 创建各种复杂图表,包括流程图、时序图、ER 图、类图、状态图、XY 图、甘特图、思维导图等。

Mermaid 图表由 Merman 实现。Firefly 在 Astro 构建阶段生成亮色和深色两套静态 SVG,无需在浏览器中加载 Mermaid 渲染运行时。可以前往 Merman Playground 实时编辑语法并预览渲染结果。

流程图示例#

流程图非常适合表示流程或算法步骤。

选项 1

选项 2

选项 3

子过程详情

子步骤 1

子步骤 2

子步骤 3

开始

条件检查

处理步骤 1

处理步骤 2

另一个决策

结果 1

结果 2

结果 3

结束

选项 1

选项 2

选项 3

子过程详情

子步骤 1

子步骤 2

子步骤 3

开始

条件检查

处理步骤 1

处理步骤 2

另一个决策

结果 1

结果 2

结果 3

结束

时序图示例#

时序图显示对象之间随时间的交互。

数据库服务器网页应用用户数据库服务器网页应用用户alt[认证成功][认证失败]提交登录请求发送认证请求查询用户凭据返回用户数据返回认证结果显示欢迎页面请求用户数据获取用户偏好返回偏好设置返回用户数据加载个性化界面显示错误消息提示重新输入
数据库服务器网页应用用户数据库服务器网页应用用户alt[认证成功][认证失败]提交登录请求发送认证请求查询用户凭据返回用户数据返回认证结果显示欢迎页面请求用户数据获取用户偏好返回偏好设置返回用户数据加载个性化界面显示错误消息提示重新输入

ER 图示例#

ER 图(实体关系图)非常适合表示数据库结构。

writes

posts

has

belongs to

USER

int

id

PK

string

username

string

email

datetime

created_at

ARTICLE

int

id

PK

string

title

text

content

datetime

published

int

author_id

FK

COMMENT

int

id

PK

text

content

datetime

created_at

int

user_id

FK

int

article_id

FK

CATEGORY

int

id

PK

string

name

string

description

writes

posts

has

belongs to

USER

int

id

PK

string

username

string

email

datetime

created_at

ARTICLE

int

id

PK

string

title

text

content

datetime

published

int

author_id

FK

COMMENT

int

id

PK

text

content

datetime

created_at

int

user_id

FK

int

article_id

FK

CATEGORY

int

id

PK

string

name

string

description

类图示例#

类图显示系统的静态结构,包括类、属性、方法及其关系。

写作

发表

拥有

属于

1

1

1

1

*

*

*

*

User

+String username

+String password

+String email

+Boolean active

+login()

+logout()

+updateProfile()

Article

+String title

+String content

+Date publishDate

+Boolean published

+publish()

+edit()

+delete()

Comment

+String content

+Date commentDate

+addComment()

+deleteComment()

Category

+String name

+String description

+addArticle()

+removeArticle()

写作

发表

拥有

属于

1

1

1

1

*

*

*

*

User

+String username

+String password

+String email

+Boolean active

+login()

+logout()

+updateProfile()

Article

+String title

+String content

+Date publishDate

+Boolean published

+publish()

+edit()

+delete()

Comment

+String content

+Date commentDate

+addComment()

+deleteComment()

Category

+String name

+String description

+addArticle()

+removeArticle()

状态图示例#

状态图显示对象在其生命周期中经历的状态序列。

提交

拒绝

批准

发布

归档

撤回

草稿

审核中

已批准

已归档

已发布

临时隐藏

恢复

活跃

隐藏

提交

拒绝

批准

发布

归档

撤回

草稿

审核中

已批准

已归档

已发布

临时隐藏

恢复

活跃

隐藏

XY 图示例#

XY 图表非常适合展示趋势和对比数据。

月度访问量趋势1月2月3月4月5月6月5000450040003500300025002000150010005000访问量
月度访问量趋势1月2月3月4月5月6月5000450040003500300025002000150010005000访问量

饼图示例#

饼图适合直观展示各部分在整体中的占比。

45%30%15%10%内容类型占比技术文章 [45]项目记录 [30]生活随笔 [15]其他 [10]
45%30%15%10%内容类型占比技术文章 [45]项目记录 [30]生活随笔 [15]其他 [10]

甘特图示例#

甘特图可以按时间轴展示项目阶段、任务依赖和当前进度。

07/0107/0307/0507/0707/0907/1107/1307/1507/17需求整理 视觉设计 功能实现 内容迁移 构建检查 正式上线 准备开发发布博客版本发布计划
07/0107/0307/0507/0707/0907/1107/1307/1507/17需求整理 视觉设计 功能实现 内容迁移 构建检查 正式上线 准备开发发布博客版本发布计划

思维导图示例#

思维导图适合梳理主题层级和知识结构。

Firefly

内容

技术文章

生活记录

体验

搜索

深色模式

图表

工程

Astro

Svelte

Merman

Firefly

内容

技术文章

生活记录

体验

搜索

深色模式

图表

工程

Astro

Svelte

Merman

时间线示例#

时间线用于按年份或阶段呈现项目的重要事件。

2024建立博客完成基础主题2025加入搜索与图库完善内容系统2026升级 Astro 7使用 Merman 渲染图表Firefly 演进时间线
2024建立博客完成基础主题2025加入搜索与图库完善内容系统2026升级 Astro 7使用 Merman 渲染图表Firefly 演进时间线

用户旅程图示例#

用户旅程图能够描述用户在不同阶段的行为和体验评分。

读者
发现内容
发现内容
读者
打开首页
打开首页
读者
搜索主题
搜索主题
阅读文章
阅读文章
读者
浏览正文
浏览正文
读者
查看图表
查看图表
继续探索
继续探索
读者
查看相关文章
查看相关文章
读者
分享文章
分享文章
读者浏览文章的旅程
读者
发现内容
发现内容
读者
打开首页
打开首页
读者
搜索主题
搜索主题
阅读文章
阅读文章
读者
浏览正文
浏览正文
读者
查看图表
查看图表
继续探索
继续探索
读者
查看相关文章
查看相关文章
读者
分享文章
分享文章
读者浏览文章的旅程

Git 图示例#

Git 图可以清晰展示分支、提交和合并历史。

mainfeatureinitadd-diagramspolish-themesmerge-featurerelease
mainfeatureinitadd-diagramspolish-themesmerge-featurerelease

看板示例#

看板适合展示任务在不同工作阶段之间的分布。

待办

进行中

已完成

整理需求

准备示例

接入 Merman

服务端渲染

亮暗主题

待办

进行中

已完成

整理需求

准备示例

接入 Merman

服务端渲染

亮暗主题

Sankey 图示例#

Sankey 图通过连线宽度展示流量在不同节点之间的流向。

Home 1650Post list 1200Search 450Post detail 1220Related posts 260External shares 180
Home 1650Post list 1200Search 450Post detail 1220Related posts 260External shares 180

总结#

Mermaid 是在 Markdown 文档中创建各种类型图表的强大工具。本文演示了流程图、时序图、ER 图、类图、状态图、XY 图、饼图、甘特图、思维导图、时间线、用户旅程图、Git 图、看板和 Sankey 图。这些图表可以帮助您更清晰地表达复杂的概念、流程和数据结构。

要使用 Mermaid,只需在代码块中指定 mermaid 语言,并使用简洁的文本语法描述图表。图表会在构建时自动渲染为 SVG,无需客户端 JavaScript 加载。

可以前往 Merman Playground 尝试更多语法,再将图表代码粘贴到文章中。

Markdown 中 PlantUML 图表指南#

PlantUML 是一种使用纯文本描述图表的工具。你只需要写一段结构化语法,就可以生成时序图、类图、用例图、活动图等常见工程图。

它特别适合写在技术博客和项目文档里:

  • 图表和正文一起版本管理,便于协作与审阅
  • 修改图只需要改文本,适合频繁迭代
  • 能和 Markdown 无缝结合,保持文档统一

在 Firefly 中,plantuml 代码块会在构建阶段编码并生成服务器 SVG 地址,页面端再根据亮暗主题自动切换图源,并支持缩放、拖拽和全屏交互。

如果你想快速上手,可以记住这个最小模板:

@startuml
Alice -> Bob: Hello
Bob --> Alice: Hi
@enduml

活动图示例#

@startuml
start
:用户提交订单;
if (库存充足?) then (是)
	:冻结库存;
	:创建支付单;
	if (支付成功?) then (是)
		:生成发货单;
		:通知仓库拣货;
	else (否)
		:取消订单;
		:释放库存;
	endif
else (否)
	:提示缺货;
endif
stop
@enduml

状态图示例#

@startuml
[*] --> 草稿

草稿 --> 待审核 : 提交
待审核 --> 草稿 : 驳回
待审核 --> 已发布 : 审核通过
已发布 --> 已归档 : 到期归档
已发布 --> 草稿 : 撤回修改

state 已发布 {
	[*] --> 可见
	可见 --> 隐藏 : 手动隐藏
	隐藏 --> 可见 : 恢复展示
}

已归档 --> [*]
@enduml

用例图示例#

@startuml
left to right direction
actor 游客
actor 用户
actor 管理员

rectangle 博客系统 {
	usecase "浏览文章" as UC1
	usecase "搜索内容" as UC2
	usecase "发表评论" as UC3
	usecase "点赞收藏" as UC4
	usecase "审核评论" as UC5
	usec

组件图示例#

@startuml
package "Firefly Site" {
	[Astro App] as App
	[Markdown Parser] as Parser
	[PlantUML Encoder] as Encoder
	[Theme Switcher] as Theme
	[Search Indexer] as Search
}

cloud "PlantUML Server" as

部署图示例#

@startuml
node "User Device" {
	artifact "Browser"
}

node "CDN / Edge" {
	artifact "Static Assets"
}

node "Cloudflare Worker" {
	artifact "SSR Handler"
}

node "PlantUML Service" {
	artifact "SVG Re

ER 图示例#

@startuml
entity User {
	*id : uuid <<PK>>
	--
	username : varchar
	email : varchar
	created_at : datetime
}

entity Post {
	*id : uuid <<PK>>
	--
	author_id : uuid <<FK>>
	title : varchar
	content :

时序图示例(登录与刷新令牌)#

@startuml
autonumber
actor User as 用户
participant Web as 前端页面
participant API as 网关接口
participant Auth as 认证服务
database Redis as 会话缓存

用户 -> 前端页面 : 输入账号密码并提交
前端页面 -> 网关接口 : POST /login
网关接口 -> 认证服务 :

C4 风格容器图示例#

@startuml
!includeurl https://raw.githubusercontent.com/plantuml-stdlib/C4-PlantUML/master/C4_Container.puml

Person(user, "博客访客", "阅读文章与搜索内容")

System_Boundary(system, "Firefly Blog") {
	Container(we

嵌入视频#

只需从 YouTube 或其他平台复制嵌入代码,然后将其粘贴到 markdown 文件中。

title: 在文章中嵌入视频
published: 2023-10-19
// ...
<iframe width="100%" height="468" src="https://www.youtube.com/embed/5gIf0_xpFPI?si=N1WTorLKL0uwLsU_" title="YouTube video player" frameborder="0" allowfullscreen></iframe>

YouTube#

Bilibili#

支持与分享

如果这篇文章对你有帮助,欢迎分享给更多人或打赏支持!

打赏
Markdown 完全教程
https://www.linglog.cc/posts/markdown-guide/
作者
Jaye
发布于
2026-08-16
许可协议
CC BY-NC-SA 4.0

评论区

Profile Image of the Author
Jaye
风儿是自由的,它路过山河,路过我,却从不停留
公告
这里主要记录生活日常,偶尔也写点技术相关的内容,写得不好还请见谅——比起做技术博客,我更想把这里当成留住回忆的地方。
分类
标签
最新动态
站点统计
文章
36
分类
4
标签
76
总字数
41,486
运行时长
0
最后活动
0 天前
站点信息
构建平台
Vercel
博客版本
LingLog v6.15.9
文章许可
CC BY-NC-SA 4.0