我想使用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在内部表示内联代码的方式:代码存储为一串逐字文本和一组属性。作为布局命令的换行符不适合此表示并被忽略。
另请注意,上述内容是编写多行代码的一种相当罕见的方式。参见,例如,MDN docs on the <code>
element:
要表示多行代码,请将
<code>
元素包装在<pre>
元素中。<code>
元素本身仅代表代码或代码行的单个短语。
问题是您的代码块没有正确格式化为代码块。您需要(至少)以下内容:
<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>
包裹的块开始,最终得到带栅栏的代码块。