You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.29 13:59:10