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">"Hello, world!"</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
相关产品推荐
相关产品推荐

