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

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

这是我目前的代码:

function CodeBlock(el)
    -- 测试手动生成内容
    -- return pandoc.LineBlock {{pandoc.Str("Some")}, {pandoc.Space()}, {pandoc.Str("content")}}

    -- 使用 read 不起作用,如何将字符串 el.text 转换?
    local contentElements = pandoc.read(el.text)
    return pandoc.LineBlock(contentElements)
end

原文链接 https://stackoverflow.com/questions/69844920

点赞
stackoverflow用户2425163
stackoverflow用户2425163

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

你的方法很好,只是对不同类型有一些缺乏清晰度:pandoc.read 函数需要一个字符串作为参数,就像 el.text 一样,并且返回一个 Pandoc 对象,其中 blocks 字段保存了一个 Block 类型的列表。这个 block 列表是 CodeBlock 函数的一个可接受的返回值。

要将文本转换为 LineBlock,我们可以将其修改为 Markdown 语法中的行块 (LineBlock)。然后,我们可以使用 pandoc.read 函数将结果文本作为 Markdown 内容读取。

在 pandoc Markdown(和 reStructuredText)中,行块的每一行都以管道字符(|)开头。因此,我们必须在每个换行符之后添加 | ,并在第一行之前加上它。

我们可以将结果传递给 pandoc.read 函数,然后返回结果的 block 列表,我们的情况下应该只有一个 LineBlock。

完整的过滤器如下:

function CodeBlock (el)
  return pandoc.read('| ' .. el.text:gsub('\n', '\n| '), 'markdown').blocks
end
2021-11-05 20:40:26