1

我想使用 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
```

但是输出 I 从来没有<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

我错过了什么吗?

4

2 回答 2

0

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

另请注意,上面是编写多行代码的一种相当不常见的方式。参见,例如,关于元素的MDN 文档<code>

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

于 2019-04-18T09:23:18.020 回答
0

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

<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>

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

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

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

当 Pandoc 从 HTML 转换回 Markdown 时,它反向遵循相同的约定。是的,您已经class="code_block"设置了<code>标签,但 Pandoc 不知道这意味着什么,也不应该知道。是的,您的<code>元素没有包装在 a 中<p>,但这只是格式不正确的 HTML(根据 HTML 规范,<code>它不是块级元素,而是短语 content;也就是说,内容被包装在块级元素中例如一个<p>或一个<pre>元素)。

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

为了完整起见,我意识到原始的 Markdown 规则不包括受保护的代码块,因此我还将指向 GitHub Flavored Markdown 规范,该规范也将受保护的代码块演示为生成<pre><code>包装块。自然,要反过来,您需要从<pre><code>包装的块开始,以结束于围栏的代码块。

于 2019-04-18T13:21:09.237 回答