【问题标题】:Pandoc replace string with table using Lua filterPandoc 使用 Lua 过滤器将字符串替换为表格
【发布时间】:2021-04-20 14:25:02
【问题描述】:

在我的文档中,我有一个占位符字符串,例如:

{{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 内容,但是如何让它与变量 string 中的 Markdown 格式内容一起使用。

【问题讨论】:

    标签: filter lua pandoc


    【解决方案1】:

    要返回任意格式而不是 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 选择不同的名称。

    【讨论】:

    • 使用以下 lua 过滤器:local tblstring = [[ | some | table | |------|-------| | val1 | val2 | ]] function Para(elem) if elem.content[1].text == "{{changelog}}" then return pandoc.read(tblstring, 'html').blocks end end return {{ Para = Para }} 和命令 pandoc test.md -f markdown --lua-filter=test.lua -t html 将导致以下输出:| some | table | |------|-------| | val1 | val2 | markdown tblstring 未转换为 html
    • 如果您传递 Markdown 输入,则使用 'markdown' 而不是 'html' 作为要读取的第二个参数。另外,请确保 tblstring 中的表格没有缩进,否则它将被读取为代码块。
    猜你喜欢
    • 2019-10-16
    • 1970-01-01
    • 2023-03-21
    • 2013-12-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-05-16
    • 2017-03-10
    相关资源
    最近更新 更多