logo W3C-blog

Markdown中代码块的包装元素

3k01 2025/10/22

今天我在markdown-it插件中遇到了一个令人惊讶的边缘情况bug,我认为值得分享!

考虑这个带有空行的示例index.md模板(markdown文件中的典型用法):

```js
// Line 1

// Line 3
```

这渲染为(这是好的、正确的、预期的✅):

<pre><code>// line 1

// line 3
</code></pre>

现在考虑这个Markdown代码(.md文件中的HTML)。这类似于任何通用语法高亮插件(比如说,即使是会返回的代码(特别是当首先将Markdown预处理为Liquid时,项目默认这样做):

<pre><code>
// line 1

// line 3
</code></pre>

这个上面按原样渲染(passthrough)而不做更改(这也是好的、正确的、预期的✅)。

现在考虑第三种情况,你的<pre>被包装在另一个HTML元素中(这里为了简单使用<div>):

<div><pre><code>
// line 1

// line 3
</code></pre></div>

这渲染为(损坏的、错误的、不预期的⛔️):

<div><pre><code>
// line 1
<p>// line 3
</code></pre></div></p>

(无论是否使用<code>元素都会发生相同的行为)

这里的要点是,如果你在<pre>周围使用包装元素来嵌套一些更复杂的元素(例如,为你的代码块添加复制到剪贴板按钮),你需要确保返回三重反引号语法而不是<pre>,这样Markdown解析器就不会引入不需要的段落元素。


2 喜欢

欧内斯特北林默
4 评论
  1. 铅笔

    W3C的标准总是很有参考价值。

  1. 懒羊羊睡醒了的头像

    懒羊羊睡醒了 CNB

    2025/11/04
    文章很及时,正好需要这个。
  2. Luke的头像

    Luke CNB

    2025/03/31
    文章很及时,正好需要这个。
  3. Ssy的头像

    Ssy CNB

    2025/03/21
    这篇文章写得很棒,学到了很多!
< 上一篇
参与行业和社区对话
下一篇 >
网络与通信