我正在尝试应用LUA过滤器,该过滤器只会改变文档的主体,保持元数据不变。它比我想象的要难。
过滤器应该在文本内嵌元素和块元素之前添加和附加文本。如果它适用于内联元素(此处为Code
),则对于块元素CodeBlock
失败。
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
我错过了什么?欢呼声,
答案 0 :(得分:2)
这里的问题是walk_block
和walk_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 },
}
这可能更有效,因为仅序列化/反序列化元数据和Code / CodeBlock元素可能比对完整文档执行相同操作更快。