Pandoc 使用 Lua 过滤器用表格替换字符串

在我的文档中有一个类似于占位符的字符串:

{{changelog}}

我想使用 Lua 过滤器将其替换为具有 Markdown 格式的表格,如果我使用 HTML,则以下 Lua 过滤器可以工作:


local string = [[
| some | table |
|------|-------|
| val1 | val2  |
]]

string = [[
<table>
    <tr>
        <td>some</td>
        <td>table</td>
    </tr>
    <tr>
        <td>val1</td>
        <td>val2</td>
    </tr>
</table>
]]
function Para(elem)
    if elem.content[1].text == "{{changelog}}" then
        return pandoc.RawBlock('html', string)
      else
        return elem
      end
end

return {{ Para = Para }}

现在,如果我使用变量 string 的 HTML 内容,它可以工作,但是如果使用具有 Markdown 格式的变量 string 内容会怎么样呢?

点赞
用户2425163
用户2425163

要返回任意格式而不是 HTML,我们必须指示 pandoc 用 pandoc.read 解析字符串:

function Para(elem)
  if elem.content[1].text == "{{changelog}}" then
    return pandoc.read(tblstring, 'html').blocks
  end
end

pandoc.read 函数接受一个字符串并将其解析为一个 pandoc 文档,其中第二个参数是格式;由于我们不感兴趣元数据,因此需要使用访问文档的 blocks

我省略了 return elem,因为如果函数没有返回值,pandoc 会保留原始元素。

另一种方法是使用 pandoc.Tablepandoc.utils.from_simple_table 等函数构建表格,但通常更费力。

此外,请注意 string 是用于 Lua 的字符串库的全局变量,因此最好为表格 HTML 选择不同的名称。

2021-04-20 06:16:40