Справедливое предупреждение, я довольно неопытен в программировании в целом.
При генерации выходных данных из документов уценки моя цель состоит в том, чтобы заменить заполнители (например, '{{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
, но я не удалось выяснить, если / как файл должен обрабатываться по-другому.
Любая помощь будет принята с благодарностью.