我尝试创建一个 Lua 过滤器来保留 HTML 注释(但不保留任何其他 HTML 元素)。
local function starts_with(start, str)
return str:sub(1, #start) == start
end
function RawInline(el)
if starts_with('<!--', el.text) then
return el
else
return nil
end
end
return {{Inline = RawInline}}
(基于 mb21 的答案:从 HTML 到 Markdwon:尽可能干净的 Markdown 标记,并保留 HTML 注释。)
目前无法使用。可能是什么问题?
pandoc -f html+raw_html from.html -o to.md -t gfm --lua-filter preserve-comments.lua
有两个小问题导致该过滤器无法工作。我在下面列出了它们,并包括每个的解释和解决方案。
主要问题是
return {{Inline = RawInline}}
。这会导致为 all内联元素调用
RawInline
函数,例如 Str、Emph、Space 等。这会导致问题,因为某些元素没有 .text
属性,并使用 starts_with
作为第二个参数调用 nil
会触发错误。
此问题的解决方案是使用
return {{RawInline = RawInline}}
,或者完全不使用该线。如果没有返回显式过滤器表,则由于 pandoc 从全局函数构造过滤器的方式,这两种解决方案是等效的。
RawInline
函数不执行任何操作,因为在这种情况下,return el
和return nil
执行相同的操作。不从过滤器函数返回任何内容会导致 pandoc 保持对象不变。通过返回 {}
可以删除对象。
总而言之,这应该有效:
local function starts_with(start, str)
return str:sub(1, #start) == start
end
function RawInline(el)
if not starts_with('<!--', el.text) then
return {}
end
end