簡體   English   中英

使用Pandoc將HTML中的多行代碼段轉換為Markdown

[英]Converting multiline code snippets in HTML to Markdown with pandoc

我想使用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> <pre>標記。 相反,相同的規則演示了生成此HTML的代碼范圍

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

請注意,僅使用<code>標記,但這僅是一個內聯范圍(包裝在<p> ,而不是塊級元素)。

當Pandoc從HTML轉換回Markdown時,它遵循相反的約定。 是的,您在<code>標記上設置了class="code_block" ,但是Pandoc不知道這意味着什么,也不應該。 是的,您的<code>元素沒有包裝在<p> ,但這只是格式不正確的HTML(根據HTML規范, <code>不是塊級元素,而是措辭內容 ;即content它包裝在塊級元素(例如<p><pre>元素)中。

然后是您的<br>標簽的問題。 Pandoc如何知道這是代碼還是樣式鈎子的一部分? 實際上,事實並非如此。 這就是為什么我們將<pre>標記用於多行代碼塊的原因。 使用<pre>標記,保留空白。 因此,您只需要沒有<br>標記的換行符。

為了完整起見,我意識到原始的Markdown規則不包括受防護的代碼塊,因此我還將指向GitHub Flavored Markdown規范,該規范還演示了受防護的代碼塊產生<pre><code>包裝的<pre><code>塊。 自然,要反向進行操作,您需要從<pre><code>包裝的塊開始,以帶有圍欄的代碼塊結束。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM