Pandoc Lua:如何为标题包裹Markdown块且不丢失Markdown语法
问题原因
原代码失效的核心原因是对pandoc文档结构的理解有误:
el.content是Header元素内部存储标题文本的内联元素集合,仅能存放Str、Emph这类行内元素,不能放入块级元素- 你将块级类型的
RawBlock插入内联集合,最后直接返回这个内联集合,会导致原有的一级标题块结构被完全破坏,pandoc无法识别该内容为标题,自然不会输出#开头的标题标记。
要实现块级元素包裹,需要直接返回由多个块级元素组成的序列,而非修改标题内部的行内内容。
修正后的过滤器代码
Header = function(el) if el.level == 1 then local div_start = pandoc.RawBlock('markdown', '::: test') local div_end = pandoc.RawBlock('markdown', ':::') -- 按顺序返回块:div起始标记、原完整标题、div结束标记 return {div_start, el, div_end} end -- 其余层级标题原样返回 return el end
效果验证
使用你提供的测试文本,调用该过滤器转换后,输出内容和预期完全一致:
::: test # Linux ::: ## Support for Linux users Create a shell script
可选优化方案:如果不需要强制写死markdown原生fenced div语法,更推荐使用pandoc内置的
Div结构实现,兼容性更强,输出HTML/PDF等其他格式时也能正确生成对应结构,pandoc输出markdown时会自动转为:::块语法:Header = function(el) if el.level == 1 then return pandoc.Div(el, pandoc.Attr("", {"test"})) end return el end
内容的提问来源于stack exchange,提问作者Fxp
相关产品推荐
相关产品推荐

