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

问题描述 投票:1回答:2

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

我错过了什么吗?

html markdown pandoc
2个回答
0
投票

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

另请注意,上述内容是编写多行代码的一种相当罕见的方式。参见,例如,MDN docs on the <code> element

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


0
投票

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

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

除了@ tarleb的答案所涵盖的HTML spec之外,Markdown规则还根据<pre>标签的存在(或不存在)来区分代码块和代码范围。

请注意,原始Markdown规则演示了code block生成此HTML:

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

<code>标签包裹的<pre>标签。相反,相同的规则演示了生成此HTML的code span

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

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

当Pandoc从HTML转换回Markdown时,它遵循相反的约定。是的,你在class="code_block"标签上设置了<code>,但是Pandoc不知道这意味着什么,也不应该知道。是的,你的<code>元素没有包裹在<p>中,但这只是格式不好的HTML(根据HTML规范,<code>不是块级元素,而是phrasing content;也就是说,内容被包裹在一个块中 - 等级元素,如<p><pre>元素)。

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

为了完整起见,我意识到原始的Markdown规则不包括有围栏的代码块,因此我还将指向GitHub Flavored Markdown规范,该规范还演示了fenced code blocks生成<pre><code>包裹块。当然,要反过来,你需要从<pre><code>包裹的块开始,最终得到带栅栏的代码块。

© www.soinside.com 2019 - 2024. All rights reserved.