自定义 Pandoc writer 元素输出

Customising Pandoc writer element output

是否可以为 pandoc writer 自定义元素输出?

给定 reStructuredText 输入

.. topic:: Topic Title

   Content in the topic

使用 HTML 编写器,Pandoc 将生成

<div class="topic">
   <p><strong>Topic Title</strong></p>
   <p>Content in the topic</p>
</div>

是否有支持的方法来更改 html 输出?比如说,<strong><mark>。或者添加另一个 class 父级 <div>.

编辑:我假设格式化是作者的责任,但也有可能是在创建 AST 时决定的。

这就是 pandoc filters are for. Possibly the easiest way is to use Lua filters,因为它们内置于 pandoc 中,不需要安装额外的软件。

基本思路是匹配根据输入创建的 AST 元素,并为目标格式生成原始输出。因此,如果所有 Strong 元素要在 HTML 中输出为 <mark>,您将编写

function Strong (element)
  -- the result will be the element's contents, which will no longer be 'strong'
  local result = element.content
  -- wrap contents in `<mark>` element
  result:insert(1, pandoc.RawInline('html', '<mark>'))
  result:insert(pandoc.RawInline('html', '</mark>'))
  return result
end

您通常希望通过 运行 pandoc --to=native YOUR_FILE.rst 检查 pandoc 的内部表示。这使得编写过滤器变得更加容易。

pandoc-discuss 邮件列表中有 similar question;它处理 LaTeX 输出,但也涉及处理自定义第一个元素。您可能会发现它具有指导意义。


注意事项:可以通过使用 pandoc 的一个功能来缩短上述内容,该功能输出 span 和 div,其中 class 已知 HTML 元素作为该元素:

function Strong (element)
  return pandoc.Span(element.content, {class = 'mark'})
end

不过我觉得还是先看一般情况比较容易。