У меня структура папок выглядит следующим образом:
chapters/
01-chapter.md
02-chapter.md
03-chapter.md
format.sh
parse.sh
парс.ш
pandoc -t html5+smart -so dist/book.html --html-q-tags chapters/*.md
формат.sh
for f in chapters/*.md;
do
pandoc "$f" -o "$f" -t \
markdown+smart+footnotes-escaped_line_breaks+example_lists \
--columns=80;
done
Моя идея заключалась в том, чтобы использовать Pandoc не только как конвертер, но и как форматер — это работало довольно хорошо, пока я не начал использовать сноски:
Когда я бегуформат.shкаждое имя ссылки, которое я использую для своих сносок, перезаписывается номером - это было бы нормально, но проблема в том, что если я затем запускаюпарс.шЯ получаю следующее сообщение:
[WARNING] Duplicate note reference '1' at line 360 column 1
Проблема в том, что 01-chapter.md
и 02-chapter.md
есть сноска [^1]
. По сути, я хотел бы, чтобы Pandoc обрабатывал сноски для каждого файла отдельно и не допускал перекрестных ссылок между моими файлами markdown, но я не вижу способа сделать это.
Есть у кого-нибудь идеи?
решение1
Нет необходимости в lua
Я просто наткнулся на эту --file-scope
опцию. Добавьте это parse.sh
, и у вас не будет проблем...
--file-scope
Анализируйте каждый файл по отдельности перед объединением для многофайловых документов. Это позволит сноскам в разных файлах с одинаковыми идентификаторами работать так, как ожидается. Если эта опция установлена, сноски и ссылки не будут работать между файлами.
решение2
Pandoc не предназначен для форматирования, но в большинстве случаев он работает достаточно хорошо.
Нет способа заставить pandoc сохранить исходные сноски, поэтому вам придется найти другой метод. Задача состоит в том, чтобы заставить pandoc последовательно читать файлы как отдельные документы, а затем объединить документы в pandoc в конечный документ. Простая передача всех входных файлов (через *.md
) заставляет pandocконкатенироватьэти файлы в один документ перед анализом разметки.
Я бы предложил использовать файл "index" (или master). Pandoc Markdown не имеет встроенного синтаксиса для включения дочерних файлов, но мы можем создать свой собственный с помощьюфильтр pandoc Lua. Например, определите файл, который свяжет все ваши главы вместе, где файлы перечислены по одному в строке в блоке кода:
``` include
chapters/1.md
chapters/2.md
chapters/3.md
```
Поместите следующий код в файл include.lua
(взят изэта суть)
--- Pandoc Lua filter to include other Markdown files
local List = require 'pandoc.List'
function CodeBlock(cb)
if cb.classes:includes'include' then
local blocks = List:new()
for line in cb.text:gmatch('[^\n]+') do
if line:sub(1,1)~='#' then
local fh = io.open(line)
blocks:extend(pandoc.read (fh:read '*a').blocks)
fh:close()
end
end
return blocks
end
end
Затем вызовите pandoc с фильтром Lua и главным/индексным файлом в качестве входных данных:
pandoc -t html5+smart -so dist/book.html --html-q-tags --lua-filter=include.lua index.md
Недостаток этого в том, что вам придется редактировать index.md
каждый раз, когда вы добавляете новый файл Markdown; кроме того, в вывод попадут только метаданные, определенные в файле индекса (хотя оба этих ограничения можно обойти, немного написав код). В остальном это должно делать именно то, что вы ищете.