如何用Pandoc Lua过滤器解除Markdown表格嵌套?
问题描述
我有一个包含以下内容的DOCX文件:
# Heading +---------------------+ | Paragraph | | | | ## Subheading | | | | +-----------------+ | | | Nested table | | | +-----------------+ | +---------------------+ One last paragraph
希望通过Pandoc处理后得到无表格结构的Markdown内容:
# Heading Paragraph ## Subheading Nested table One last paragraph
我尝试用Pandoc的Lua过滤器处理,但没Lua开发经验,目前写了个框架没进展:
function Table(table) pandoc.walk_block(table, { Str = function(el) -- TODO now what??? end }) end
解决方案
你的核心需求是把表格里的所有内容提取出来,替换掉原表格。不需要用pandoc.walk_block遍历文本,直接遍历表格的行和单元格即可,以下是完整的Lua过滤器代码:
function Table(table) local extracted_content = {} -- 遍历表格的每一行 for _, row in ipairs(table.content) do -- 遍历当前行的每个单元格 for _, cell in ipairs(row.cells) do -- 将单元格内的所有块元素(段落、标题等)加入结果列表 for _, block in ipairs(cell) do table.insert(extracted_content, block) end end end -- 返回提取的内容,替换原表格 return extracted_content end
代码解释
- 捕获Table元素:Pandoc会自动调用
Table函数处理文档中的所有表格 - 遍历表格结构:依次遍历表格的行、每行的单元格
- 提取单元格内容:每个单元格里的内容(比如段落、标题、甚至嵌套表格)都是块元素,直接收集这些元素
- 替换原表格:返回收集到的所有块元素,Pandoc会用这些内容替代原来的表格
使用方法
将上述代码保存为unwrap-tables.lua,然后运行Pandoc命令:
pandoc 你的输入文件.docx -o 输出文件.md --lua-filter=unwrap-tables.lua
注意事项
- 嵌套表格会被自动递归处理,最终也会展开成普通文本
- 空白单元格因为没有内容块,会被自动忽略,不会生成空行
内容的提问来源于stack exchange,提问作者Rafi
相关产品推荐
相关产品推荐

