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

时间:2019-04-17 14:17:55

标签: html markdown pandoc

我想使用pandoc将HTML的这段代码转换为Markdown。

public class BaseController : Controller
{
    public BaseController()
    {
          //Set CurrentCulture and CurrentUICulture of the thread
    }
}

我想要的输出是这样的。

public class HomeController: BaseController    
{
    [HttpGet]
    public ActionResult Index()
    {
        //..............................................
    }
}

但是我的输出我从未在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
```

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

<br>

我想念什么吗?

2 个答案:

答案 0 :(得分:0)

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

还要注意,以上是编写多行代码的一种相当不常见的方法。参见例如MDN docs on the <code> element

  

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

答案 1 :(得分:0)

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

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

@tarleb的答案中除了HTML spec之外,Markdown规则还仅根据代码来区分代码 block 和代码 span <pre>标签的存在(或不存在)。

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

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

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

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

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

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

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

为完整起见,我意识到原始的Markdown规则不包括受防护的代码块,因此我还将指向GitHub Flavored Markdown规范,该规范还演示了phrasing content产生了<pre><code>包装的块。自然,要反向进行操作,您需要以<pre><code>包装的块开始,以带有围栏的代码块结束。