从 Markdown 转换为 HTML 时使用 Pandoc Lua 过滤器替换 HTML 标签

问题描述

我有一个 Markdown 文件,其中包含一些 HTML 标签,特别是 <br> 标签,我想在使用 pandoc 转换为 HTML 时替换它。问题是我想用 <br /> 替换它,因为与一些抱怨 <br> 的旧渲染器存在兼容性问题。我在运行转换时确实尝试了以下 Lua 过滤器,但它没有做任何事情:

filter.lua

function LineBreak (elem)
    return {
        pandoc.RawInline('html','<br />')
    }
end

我正在使用 Pandoc 版本 2.13,并通过以下测试文件运行以下命令:

Test.md

## Testing

Hello <br> World!

pandoc --lua-filter filter.lua --to html5 Test.md

我也尝试指定 --to html4输出仍然相同。有没有办法用 Lua 过滤器做到这一点?

解决方法

为了调试这个,我们可以先运行 pandoc --to=native Test.md 来查看输入是如何被解析为 pandoc 的内部文档表示的。这产生了

[Header 2 ("testing",[],[]) [Str "Testing"],Para [Str "Hello",Space,RawInline (Format "html") "<br>",Str "World!"]]

有趣的部分是 <br> 被解析为 RawInline (Format "html") "<br>",而不是换行符。所以我们可以修改过滤器以匹配它:

function RawInline (raw)
  if raw.format == 'html' and raw.text == '<br>' then
    return pandoc.RawInline('html','<br />')
  end
end

这给出了想要的结果:

$ pandoc --lua-filter filter.lua --to html5 Test.md
<h2 id="testing">Testing</h2>
<p>Hello <br /> World!</p>