You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Haskell中Pandoc库代码格式化失效如何解决?

问题

使用Pandoc CLI执行命令pandoc test.md -o test.html --highlight-style=pygments时,Markdown里的代码块能正常转换成带语法高亮的规范HTML:

<div class="sourceCode" id="cb1"><pre
class="sourceCode python"><code class="sourceCode python"><span id="cb1-1"><a href="#cb1-1" aria-hidden="true" tabindex="-1"></a><span class="kw">def</span> hello_world():</span>
<span id="cb1-2"><a href="#cb1-2" aria-hidden="true" tabindex="-1"></a>    <span class="bu">print</span>(<span class="st">&quot;Hello, world!&quot;</span>)</span></code></pre></div>

但用Haskell的Pandoc库编写代码时,如下实现:

processMarkdown :: Text -> IO Text
processMarkdown filePath = runIOorExplode $ do
  let readerOpts = def {readerExtensions = enableExtension Ext_yaml_metadata_block (readerExtensions def)}
  result <- readMarkdown readerOpts filePath
  let writerOpts = def {writerHighlightStyle = Just pygments}
  writeHtml5String writerOpts result

生成的HTML里代码块被压缩成了一行,且没有语法高亮:

<p><code>python def hello_world():     print("Hello, world!")</code></p>
解决方案

问题核心是阅读器未启用代码块解析扩展,写入器未开启语法高亮逻辑,修改后的代码如下:

import Text.Pandoc.Extensions (enableExtension, Ext_code_blocks, Ext_fenced_code_blocks)
import Text.Pandoc.Writers.HTML (WriterOptions(..), Html5Options(..))

processMarkdown :: Text -> IO Text
processMarkdown filePath = runIOorExplode $ do
  -- 启用代码块相关扩展,确保Markdown代码块被正确识别
  let readerOpts = def 
        { readerExtensions = enableExtension Ext_code_blocks $ 
                            enableExtension Ext_fenced_code_blocks $ 
                            enableExtension Ext_yaml_metadata_block (readerExtensions def)
        }
  result <- readMarkdown readerOpts filePath
  -- 开启语法高亮并保留代码块格式
  let writerOpts = def 
        { writerHighlightStyle = Just pygments
        , writerHtml5 = def { html5Highlight = True }
        , writerExtensions = enableExtension Ext_code_blocks (writerExtensions def)
        }
  writeHtml5String writerOpts result

关键配置说明

  • 阅读器扩展:必须启用Ext_code_blocks(缩进式代码块)和Ext_fenced_code_blocks(```包裹的代码块),否则Pandoc会将代码块识别为普通段落文本。
  • 写入器配置:html5Highlight = True会触发语法高亮逻辑,生成带sourceCode类的嵌套HTML结构,同时保留代码的换行和缩进格式。
  • 需确保导入对应的扩展模块,避免编译错误。

内容的提问来源于stack exchange,提问作者Thomas Schafer

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.05 15:52:55