title: Markdown 语法

description: Halo 编辑器中所支持的 Markdown 语法说明

写在前面

从 1.5.0 版本开始,Halo 默认保存编辑器渲染的 html 文档。使用的 Markdown 渲染库为 markdown-it,我们也对此进行了封装:@halo-dev/markdown-renderer。后续我们会在任何需要渲染 Markdown 的地方都使用此库,保证 Markdown 渲染结果一致。

基础语法

markdown-it 使用了 CommonMark spec 规范,基础语法请参考 CommonMark spec

自动链接(Auto Link)

支持自动将一个链接格式的文本转换为 a 标签链接。

语法规则:

  1. https://halo.run

渲染结果:

  1. <a href="https://halo.run">https://halo.run</a>

预览:

https://halo.run

代码块(Code Block)

语法规则:

````markdown {1}

  1. 内容
  1. 示例:
  2. ````markdown {1}
  3. ```java
  4. public static void main(String[] args){
  5. System.out.println("Hello World!");
  6. }
  7. ```

````markdown {1}

  1. console.log("Hello World!")
  1. :::info
  2. 注意:代码高亮需要主题添加插件支持,不同的主题可能有实现差异。
  3. :::
  4. ## 缩写(abbr)
  5. 语法规则:
  6. ```markdown
  7. *[HTML]: Hyper Text Markup Language
  8. *[W3C]: World Wide Web Consortium
  9. The HTML specification
  10. is maintained by the W3C.
  11. ```
  12. 渲染结果:
  13. ```html
  14. <p>
  15. The
  16. <abbr title="Hyper Text Markup Language">
  17. HTML
  18. </abbr>
  19. specification
  20. <br />
  21. is maintained by the
  22. <abbr title="World Wide Web Consortium">
  23. W3C
  24. </abbr>
  25. .
  26. </p>
  27. ```
  28. ## Attrs
  29. 此语法支持将 `id` `class` `target` 添加到渲染后的 HTML 标签上。
  30. 示例:
  31. ```markdown
  32. # Halo {#halo}
  33. ```
  34. ```markdown
  35. > Hello Halo {.info}
  36. ```
  37. ```markdown
  38. [https://halo.run](https://halo.run) {target="_blank"}
  39. ```
  40. 渲染结果:
  41. ```html
  42. <h1 id="halo" tabindex="-1">Halo</h1>
  43. ```
  44. ```html
  45. <blockquote class="info"> <p>Hello Halo</p> </blockquote>
  46. ```
  47. ```html
  48. <a href="https://halo.run" target="_blank">https://halo.run</a>
  49. ```
  50. ## Emoji
  51. 支持将 Emoji 的文字形式转化为图片形式。
  52. 示例:
  53. ```markdown
  54. :100:
  55. ```
  56. 渲染结果:
  57. ```html
  58. 💯
  59. ```
  60. ## 脚注(Footnote)
  61. 语法规则:
  62. ```markdown
  63. [^脚注名]
  64. [^脚注名]: 脚注内容
  65. ```
  66. 示例:
  67. ```html
  68. 驿外[^1]断桥边,寂寞开无主。已是黄昏独自愁,更着风和雨
  69. [^1]: 驿(yì)外:指荒僻、冷清之地。驿,驿站。
  70. ```
  71. 渲染结果:
  72. ```html
  73. <p>
  74. 驿外
  75. <sup class="footnote-ref">
  76. <a href="#fn1" id="fnref1">
  77. [1]
  78. </a>
  79. </sup>
  80. 断桥边,寂寞开无主。已是黄昏独自愁,更着风和雨
  81. </p>
  82. <hr class="footnotes-sep">
  83. <section class="footnotes">
  84. <ol class="footnotes-list">
  85. <li id="fn1" class="footnote-item">
  86. <p>
  87. 驿(yì)外:指荒僻、冷清之地。驿,驿站。
  88. <a href="#fnref1" class="footnote-backref">
  89. ↩︎
  90. </a>
  91. </p>
  92. </li>
  93. </ol>
  94. </section>
  95. ```
  96. ## 下划线(ins)
  97. 示例:
  98. ```markdown
  99. ++inserted++
  100. ```
  101. 渲染结果:
  102. ```html
  103. <ins>inserted</ins>
  104. ```
  105. 预览:
  106. <ins>inserted</ins>
  107. ## 标记(mark)
  108. 示例:
  109. ```markdown
  110. ==marked==
  111. ```
  112. 渲染结果:
  113. ```html
  114. <mark>marked</mark>
  115. ```
  116. 预览:
  117. <mark>marked</mark>
  118. ## 下标(sub)
  119. 示例:
  120. ```markdown
  121. H~2~0
  122. ```
  123. 渲染结果:
  124. ```html
  125. H<sub>2</sub>0
  126. ```
  127. 预览:
  128. H<sub>2</sub>0
  129. ## 上标(sup)
  130. 示例:
  131. ```markdown
  132. 29^th^
  133. ```
  134. 渲染结果:
  135. ```html
  136. 29<sup>th</sup>
  137. ```
  138. 预览:
  139. 29<sup>th</sup>
  140. ## 目录(TOC)
  141. 此语法支持根据标题生成文档目录。
  142. 示例:
  143. ```markdown
  144. [toc]
  145. # Heading
  146. ## Sub heading 1
  147. Some nice text
  148. ## Sub heading 2
  149. Some even nicer text
  150. ```
  151. 渲染结果:
  152. ```html
  153. <p>
  154. <div class="table-of-contents">
  155. <ul>
  156. <li>
  157. <a href="#heading">
  158. Heading
  159. </a>
  160. <ul>
  161. <li>
  162. <a href="#sub-heading-1">
  163. Sub heading 1
  164. </a>
  165. </li>
  166. <li>
  167. <a href="#sub-heading-2">
  168. Sub heading 2
  169. </a>
  170. </li>
  171. </ul>
  172. </li>
  173. </ul>
  174. </div>
  175. </p>
  176. <h1 id="heading" tabindex="-1">
  177. Heading
  178. </h1>
  179. <h2 id="sub-heading-1" tabindex="-1">
  180. Sub heading 1
  181. </h2>
  182. <p>
  183. Some nice text
  184. </p>
  185. <h2 id="sub-heading-2" tabindex="-1">
  186. Sub heading 2
  187. </h2>
  188. <p>
  189. Some even nicer text
  190. </p>
  191. ```
  192. ## 任务列表(Task Lists)
  193. 示例:
  194. ```markdown
  195. - [x] Apple
  196. - [ ] Banana
  197. ```
  198. 渲染结果:
  199. ```html
  200. <ul class="contains-task-list">
  201. <li class="task-list-item">
  202. <input class="task-list-item-checkbox" checked="" disabled="" type="checkbox">
  203. Apple
  204. </li>
  205. <li class="task-list-item">
  206. <input class="task-list-item-checkbox" disabled="" type="checkbox">
  207. Banana
  208. </li>
  209. </ul>
  210. ```
  211. 预览:
  212. - [x] Apple
  213. - [ ] Banana
  214. ## 数学公式(Katex)
  215. 我们使用了 Katex 作为数学公式渲染的插件,因为从 1.5.0 开始,我们将直接保存编辑器渲染的内容,在保存的时候就已经保存了渲染好的 Katex 结构。所以在前台无需引入 Katex 插件来进行渲染,但目前仍需要引入 Katex 的样式文件,如果主题没有支持,可以在系统设置的 `自定义内容页 head:` 中加入以下代码:
  216. ```html
  217. <link rel="stylesheet" href="https://unpkg.com/katex@0.12.0/dist/katex.min.css" />
  218. ```
  219. ### 行内公式
  220. 示例:
  221. ```markdown
  222. $\sqrt{3x-1}+(1+x)^2$
  223. ```
  224. 预览:
  225. Example$\sqrt{3x-1}+(1+x)^2$
  226. ### 块级公式
  227. 示例:
  228. ```markdown
  229. $$\begin{array}{c}
  230. \nabla \times \vec{\mathbf{B}} -\, \frac1c\, \frac{\partial\vec{\mathbf{E}}}{\partial t} &
  231. = \frac{4\pi}{c}\vec{\mathbf{j}} \nabla \cdot \vec{\mathbf{E}} & = 4 \pi \rho \\
  232. \nabla \times \vec{\mathbf{E}}\, +\, \frac1c\, \frac{\partial\vec{\mathbf{B}}}{\partial t} & = \vec{\mathbf{0}} \\
  233. \nabla \cdot \vec{\mathbf{B}} & = 0
  234. \end{array}$$
  235. ```
  236. 预览:
  237. $$\begin{array}{c}
  238. \nabla \times \vec{\mathbf{B}} -\, \frac1c\, \frac{\partial\vec{\mathbf{E}}}{\partial t} &
  239. = \frac{4\pi}{c}\vec{\mathbf{j}} \nabla \cdot \vec{\mathbf{E}} & = 4 \pi \rho \\
  240. \nabla \times \vec{\mathbf{E}}\, +\, \frac1c\, \frac{\partial\vec{\mathbf{B}}}{\partial t} & = \vec{\mathbf{0}} \\
  241. \nabla \cdot \vec{\mathbf{B}} & = 0
  242. \end{array}$$
  243. ## 图表(Mermaid)
  244. Halo 1.5.0 开始,编辑器支持渲染 Mermaid 图表为 svg 内容,并直接保存渲染后的内容,所以无需在前台引入 Mermaid 插件进行渲染。
  245. 示例:
  246. ````markdown
  247. ```mermaid
  248. graph TD;
  249. A-->B;
  250. A-->C;
  251. B-->D;
  252. C-->D;
  253. ```
  1. ```mermaid
  2. sequenceDiagram
  3. participant Alice
  4. participant Bob
  5. Alice->>John: Hello John, how are you?
  6. loop Healthcheck
  7. John->>John: Fight against hypochondria
  8. end
  9. Note right of John: Rational thoughts <br/>prevail!
  10. John-->>Alice: Great!
  11. John->>Bob: How about you?
  12. Bob-->>John: Jolly good!
  13. ```

预览:

  1. graph TD;
  2. A-->B;
  3. A-->C;
  4. B-->D;
  5. C-->D;
  1. sequenceDiagram
  2. participant Alice
  3. participant Bob
  4. Alice->>John: Hello John, how are you?
  5. loop Healthcheck
  6. John->>John: Fight against hypochondria
  7. end
  8. Note right of John: Rational thoughts <br/>prevail!
  9. John-->>Alice: Great!
  10. John->>Bob: How about you?
  11. Bob-->>John: Jolly good!

短连接

参考 1.4.17/Markdown 语法。目前已经在 1.5.x 移除,建议直接使用官方提供的嵌入代码。