如何在 Pandoc lua 过滤器中将 CodeBlock 转换为 LineBlock

How to convert CodeBlock into LineBlock in Pandoc lua filter

我想在 Pandoc Lua 过滤器中将 CodeBlock 转换为 LineBlock。该转换的问题是 CodeBlock 元素有一个 text 属性(一个字符串),但是 LineBlock 需要内联内容元素(每个单词,space,换行符等。它自己的元素)。如何将 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

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

您的方法很好,只是似乎对不同的类型有些不清楚:pandoc.read 采用字符串,如 el.text,而 return 是 Pandoc 对象,它的 blocks 字段中有一个 Block 值的列表。 此块列表是 CodeBlock 函数可接受的 return 值。

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

将生成的文本阅读为 Markdown

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

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

这是完整的过滤器:

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