Pandoc 中的 Lua 过滤器:从文件中替换字符串

警告:我在编程方面经验不足。

在从 markdown 文档生成输出时,我的目标是用同名文件(即 'string.md' 文件)中的文本来替换占位符(例如 '{{string}}')。我已经成功用 .md 文件的第一行文本替换字符串。

然而,我无法找到一种用多行文本替换字符串的方法(基本上是一个包含函数)。

第一个任务的代码是基于 Pandoc 手册 中的一些示例编写的:

function file_exists(file)
  local f = io.open(file, "rb")
  if f then f:close() end
  return f ~= nil
end

function lines_from(file)
  if not file_exists(file) then return {} end
  lines = {}
  for line in io.lines(file) do
    lines[#lines + 1] = line
  end
  return lines
end

return {
  {
    Str = function (elem)
      if elem.text:match ("{{.+}}") then
        file_name = elem.text:match ("{{.+}}")
        file_name = file_name:gsub("{{","")
        file_name = file_name:gsub("}}","")
        local file = 'lua-filters/'..file_name..'.md'
            if not file_exists(file) then
            return elem
            else
            local lines = lines_from(file)
            return pandoc.Str(elem.text:gsub("{{.+}}",lines[1]))
        end
      else
        return elem
      end
    end,
  }
}

每当发现一个占位符 '{{string}}' 时,它将被替换为相应文件 'string.md' 的第一行。例如:

{{project}} 是项目名称。

项目编号是 {{projectno}}。

转换为:

Project Name 是项目名称。

项目编号是 456321

使用第二个 Lua 过滤器,我希望能够使用占位符字符串,而不仅仅是第一行,返回文本文件的全部内容。然而,我无法找到如何返回相应文件的所有行(使用上述相同代码)或将文件内容转换为更合适的元素的方法。

期望的结果是:

## 包含部分

}}lorem-ipsum{{

转换为:

## 包含部分

Lorem ipsum dolor sit amet....

Ut enim ad minim veniam...

其中 'Lorem ipsum...' 是文件 'lorem-ipsum.md' 的内容。使用 pairs 只能返回第一行:

        if not file_exists(file) then
        return elem
        else
        local lines = lines_from(file)
        for k,v in pairs(lines) do
        return pandoc.Str(v)
        end

另一种方法可能是使用 Paraelem.content[1].text 而不是 Strelem.text,但我无法弄清楚文件应该如何不同处理。

任何帮助将不胜感激。

点赞