lua和WACK_块中的pandoc过滤器

lua和WACK_块中的pandoc过滤器,lua,pandoc,Lua,Pandoc,我正在尝试应用一个LUA过滤器,它只会改变文档的主体,而不会改变元数据。这比我想象的要难 过滤器应该在内联元素和块元素前面加上文本并将其附加到内联元素。如果它适用于内联元素,这里是code,那么对于块元素code块,它将失败 function Pandoc(doc) blocks = {} for k,block in pairs(doc.blocks) do table.insert(blocks, pandoc.walk_block(block, { -- Doe

我正在尝试应用一个LUA过滤器,它只会改变文档的主体,而不会改变元数据。这比我想象的要难

过滤器应该在内联元素和块元素前面加上文本并将其附加到内联元素。如果它适用于内联元素,这里是
code
,那么对于块元素
code块
,它将失败

function Pandoc(doc)
  blocks = {}
  for k,block in pairs(doc.blocks) do
    table.insert(blocks, pandoc.walk_block(block, {
      -- Doesn't work!?
      CodeBlock = function(el)
        return {
          pandoc.Para({pandoc.Str("Before")}),
          el,
          pandoc.Para({pandoc.Str("After")})}
      end,
      -- Works!
      Code = function(el)
        return {pandoc.Str("Before"), el, pandoc.Str("After")}
      end,
    }))
  end

  return pandoc.Pandoc(blocks, doc.meta)
end

我错过了什么?干杯,

这里的问题是
walk\u block
walk\u inline
处理元素的内容,而不是元素本身

如果
wrapper
是您的筛选表,则应该执行您想要的操作:

function Pandoc (doc)
  local div = pandoc.Div(doc.blocks)
  local blocks = pandoc.walk_block(div, wrapper).content
  return pandoc.Pandoc(blocks, doc.meta)
end
另一种解决方案是保存和恢复元数据,如下所示:

local meta = {}
return {
  { Meta = function(m) meta = m; return {} end },
  wrapper,
  { Meta = function(_) return meta; end },
}

这可能更有效,因为仅序列化/反序列化元数据和代码/代码块元素可能比对完整文档执行相同操作更快。

我遇到了pandoc.Div解决方案的问题。虽然男人过滤的方法很有魅力。谢谢!很抱歉,通过访问
div
.content
字段忘记取回块。第一个解决方案现在也应该起作用了。