使用 pandoc 将 HTML 中的多行代码片段转换为 Markdown



我想使用 pandoc 将这段 HTML 翻译成 Markdown。

<code class="code_block"># chown root:root /boot/grub/grub.cfg<br/># chmod og-rwx /boot/grub/grub.cfg 
</code>

我想要的输出是这样的。

```
# chown root:root /boot/grub/grub.cfg
# chmod og-rwx /boot/grub/grub.cfg
```

但是输出我从来没有在 markdown 文件中分别包含<br>换行符。

# chown root:root /boot/grub/grub.cfg# chmod og-rwx /boot/grub/grub.cfg

我已经尝试了不同的命令和扩展。

$ pandoc -f html -t markdown t.html
$ pandoc -f html -t markdown+hard_line_breaks t.html 
$ pandoc -f html -t markdown+raw_html+hard_line_breaks t.html
$ pandoc -f html -t markdown+raw_html+hard_line_breaks-inline_code_attributes t.html

我错过了什么吗?

这是由于 pandoc 在内部表示内联代码的方式:代码与一组属性一起存储为一串逐字文本。换行符是布局命令,不适合此表示形式,因此会被忽略。

另请注意,以上是编写多行代码的一种相当罕见的方法。例如,请参阅<code>元素上的 MDN 文档:

若要表示多行代码,请将<code>元素包装在<pre>元素中。<code>元素本身仅表示单个代码短语或代码行。

问题是您的代码块未正确格式化为代码块。您(至少)需要以下内容:

<pre><code># chown root:root /boot/grub/grub.cfg
# chmod og-rwx /boot/grub/grub.cfg 
</code></pre>

除了 @tarleb 的答案中涵盖的 HTML 规范之外,Markdown 规则还仅根据<pre>标记的存在(或不存在)来区分代码和代码跨度

请注意,原始的 Markdown 规则演示了生成此 HTML 的代码块:

<pre><code>This is a code block.
</code></pre>

包装在<pre>标签中的<code>标签。相反,相同的规则演示了生成此 HTML 的代码跨度:

<p>Use the <code>printf()</code> function.</p>

请注意,仅使用<code>标记,但它只是一个内联跨度(包装在<p>中,而不是块级元素。

当Pandoc从HTML转换回Markdown时,它遵循相同的约定。是的,你的<code>标签上class="code_block"设置的,但潘多克不知道这意味着什么,也不应该。是的,您的<code>元素没有包装在<p>中,但这只是格式不佳的 HTML(根据 HTML 规范,<code>不是块级元素,而是措辞内容;也就是说,包装在块级元素(如<p><pre>元素)中的内容)。

然后是你的<br>标签的问题。Pandoc 如何知道这是代码的一部分还是样式钩子?事实上,事实并非如此。这就是为什么我们对多行代码块使用<pre>标签的原因。使用<pre>标记,将保留空格。因此,您只需要一个没有<br>标记的换行符。

为了完整起见,我意识到原始的 Markdown 规则不包括受防护的代码块,因此我还将指出 GitHub Flavored Markdown 规范,该规范还演示了受防护的代码块生成<pre><code>包装块。当然,要反过来,您需要从<pre><code>包装块开始,最终得到受围栏的代码块。

最新更新