如何在Pandoc Lua过滤器中将CodeBlock转换为LineBlock
Pandoc Lua过滤器CodeBlock转LineBlock解决方案
原代码问题原因
pandoc.read默认返回完整的Pandoc文档对象(根节点下是块元素列表),而LineBlock要求的入参结构是嵌套列表:外层每个元素对应一行内容,内层是该行对应的内联元素列表,两者结构不匹配所以无法生效。
正确实现代码
function CodeBlock(el) local line_content = {} -- 按换行拆分原始文本,逐行处理 for line in el.text:gmatch('[^\r\n]*') do -- 解析单行文本为内联元素序列,指定plain格式避免误解析Markdown语法 local parsed_inlines = pandoc.read(line, 'plain').blocks[1].content table.insert(line_content, parsed_inlines) end return pandoc.LineBlock(line_content) end
实现说明
- 拆分文本时使用
[^\r\n]*匹配可以保留原始文本中的空行 - 如果你需要识别行内的Markdown格式(比如斜体、行内代码),可以把
pandoc.read的第二个参数从plain改成markdown - 解析后的
parsed_inlines已经自动拆分好Str、Space等标准内联元素,完全符合LineBlock的入参要求
内容的提问来源于stack exchange,提问作者chiborg
相关产品推荐
相关产品推荐

