如何在Pandoc Lua过滤器中获取当前处理文档的文件名?
获取Pandoc Lua过滤器中的当前文档文件名并集成Git日志
当然可以实现!Pandoc的Lua过滤器提供了直接访问当前处理文档路径的能力,你只需要利用内置的pandoc.state对象就能拿到输入文件的信息,进而替换你代码中的FILE占位符。
下面是修改后的完整过滤器代码,我还加了一些实用的细节处理:
function Pandoc(doc) -- 获取第一个输入文件的完整路径(单文件场景下直接取第一个元素即可) local input_file_path = pandoc.state.input_files[1] if not input_file_path then table.insert(doc.blocks, pandoc.Para("⚠️ 未检测到输入文件")) return doc end -- 可选:如果只需要文件名(不含路径),用pandoc.path的工具函数提取 local filename = pandoc.path.filename(input_file_path) -- 构造安全的git log命令,用单引号包裹文件名避免空格/特殊字符报错 local git_cmd = string.format("git log '%s'", filename) -- 执行命令并读取输出 local handle = io.popen(git_cmd) if not handle then table.insert(doc.blocks, pandoc.Para("❌ 无法执行Git命令,请检查当前目录是否在Git仓库中")) return doc end local git_log_content = handle:read("*a") handle:close() -- 将Git日志以代码块形式添加到文档末尾 table.insert(doc.blocks, pandoc.CodeBlock(git_log_content, {class = "git-log"})) return doc end
关键细节说明:
- 获取文件路径:
pandoc.state.input_files是一个数组,包含所有传入Pandoc的输入文件路径。如果是单文件处理,直接取[1]即可;多文件场景下可以遍历这个数组分别处理。 - 安全的命令构造:用
string.format配合单引号包裹文件名,避免文件名含空格、特殊字符时导致shell命令解析错误。如果你的文件名可能包含单引号,还需要额外转义(比如把'替换为'\'')。 - 错误处理:添加了对输入文件不存在、Git命令执行失败的判断,避免过滤器静默出错,同时给用户明确的提示。
- 格式控制:把日志内容放在
CodeBlock中,并添加了git-log类,方便后续用CSS样式自定义显示效果,你也可以根据需求改成普通段落或其他元素。
额外提示:
如果你的Git仓库不在当前工作目录,建议直接使用完整的input_file_path代替文件名,确保git log能正确找到目标文件:
local git_cmd = string.format("git log '%s'", input_file_path)
内容的提问来源于stack exchange,提问作者asio
相关产品推荐
相关产品推荐

