【问题标题】:How to convert CodeBlock into LineBlock in Pandoc lua filter如何在 Pandoc lua 过滤器中将 CodeBlock 转换为 LineBlock
【发布时间】:2021-11-04 19:38:20
【问题描述】:

我想在 Pandoc Lua 过滤器中将 CodeBlock 转换为 LineBlock。该转换的问题在于CodeBlock 元素具有text 属性(字符串),但LineBlock 需要内联内容元素(每个单词、空格、换行符等都有自己的元素)。如何将text 属性转换为适合LineBlock 的内容?

这就是我的代码在 ATM 上的样子:

function CodeBlock(el)
    -- test for manually generating content
    -- return pandoc.LineBlock {{pandoc.Str("Some")}, {pandoc.Space()}, {pandoc.Str("content")}}

    -- using read does not work, how can I convert the string el.text?
    local contentElements = pandoc.read(el.text)
    return pandoc.LineBlock(contentElements)
end

【问题讨论】:

    标签: lua pandoc


    【解决方案1】:

    我假设代码块中的文本采用 Markdown 格式,因为这是 pandoc 最常用的输入格式。

    您的方法很好,只是似乎对不同类型有些不清楚:pandoc.read 接受一个字符串,如el.text,并返回一个Pandoc 对象,其中包含@987654324 列表@ 其blocks 字段中的值。 此块列表是 CodeBlock 函数可接受的返回值。

    要将文本转换为 LineBlock,我们可以对其进行修改,使其成为 Markdown 语法中的行块。然后我们可以使用 pandoc.read 将生成的文本读取为 Markdown。

    pandoc Markdown(和 reStructuredText)中的行块在每行的开头都有一个竖线字符。所以我们必须在每个换行符之后添加| ,并将其添加到第一行。

    我们可以将结果传递给pandoc.read,然后返回结果块​​,在我们的例子中它应该只是一个 LineBlock。

    这是完整的过滤器:

    function CodeBlock (el)
      return pandoc.read('| ' .. el.text:gsub('\n', '\n| '), 'markdown').blocks
    end
    

    【讨论】:

      猜你喜欢
      • 2019-10-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-01-04
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多