Lua -фильтры в Pando c: замена строки текстом из файла - PullRequest
0 голосов
/ 07 апреля 2020

Справедливое предупреждение, я довольно неопытен в программировании в целом.

При генерации выходных данных из документов уценки моя цель состоит в том, чтобы заменить заполнители (например, '{{string}}') текстом из внешнего файл с тем же именем (то есть 'string.md'). Мне удалось добиться замены строки первой строкой текста файла .md.

Однако я изо всех сил пытаюсь найти способ заменить строку несколькими строками текста (по сути, include function).

Код для первого задания основан на некоторых примерах из Pando c manual :

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}} is the project name.

The project number is {{projectno}}.

превращается в:

Project Name is the project name.

The project number is 456321.

Со вторым lua -фильтром я хочу иметь возможность использовать строку-заполнитель, где - вместо только первая строка - возвращается полное содержимое текстового файла. Однако я не смог или найти способ вернуть все строки соответствующего файла (используя тот же код, что и выше) или преобразовать содержимое файла в более соответствующий элемент.

Желаемый результат будет:

## Include section

}}lorem-ipsum{{

Превращается в:

## Include section

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

Другой подход может заключаться в использовании Para и elem.content[1].text вместо Str и elem.text, но я не удалось выяснить, если / как файл должен обрабатываться по-другому.

Любая помощь будет принята с благодарностью.

...