Markdown中代码块的包装元素
今天我在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解析器就不会引入不需要的段落元素。
4 评论
铅笔
W3C的标准总是很有参考价值。
懒羊羊睡醒了 CNB
2025/11/04Luke CNB
2025/03/31Ssy CNB
2025/03/21