Включить файлы в документ Markdown с помощью Pandoc (кроме Haskell)

3384
certainlyakey

Я использую Pandoc для создания презентаций Reveal.js из документов Markdown, перейдя на него из Google Slides. С самого начала я решил, что презентации для различных событий и лекций должны автоматически комбинироваться из нескольких файлов - таким образом, легче поддерживать отдельные слайды без необходимости постоянного обновления контента в нескольких местах.

Решение на данный момент объединяет Codekit (используя его язык Kit) и pandoc. Таким образом, отдельные части презентаций подготавливаются в редакторе, затем передаются в одном .kitфайле с операторами @import, а затем полученный файл Markdown обрабатывается pandoc, который создает HTML-презентацию (последняя часть выполняется системой сборки Sublime Text).

Я бы хотел как-то упростить этот процесс с помощью какого-то скрипта, который автоматически обрабатывал бы объединенный файл Markdown каждый раз, когда его съедал pandoc. На StackExchange есть сообщения, которые ссылаются на фильтры Haskell, но установка Haskell слишком велика для моей крошечной системы (минимум 800 Мб).

Есть ли способ включить файлы с другим языком программирования или трюк? Например, я знаю, что можно объединить несколько файлов, объединив их имена в команде pandoc, но это не делает рабочий процесс более плавным и быстрым.

2

2 ответа на вопрос

1
John MacFarlane

In principle, you can write pandoc filters in any language, though Haskell is particularly well suited. The pandocfilters library makes it easy to write them in python.

Here's a tutorial on pandoc filters. It contains a sample Haskell filter for include files, which should be pretty easy to translate to a python filter using pandocfilters.

See also the directory of examples in the pandocfilters repository.

1
certainlyakey

Я наконец выяснил несколько способов сделать задачу.

Во-первых, использовать фильтр pandoc, написанный на Python, который включает в себя (он работает так же, как фильтр Haskell, описанный в pandoc docs). Однако теперь он адаптирован для использования только с включенными блоками кода, а не с частями общего содержимого.

Второй способ заключается в использовании встроенного сценария Perl, который может быть добавлен перед командой сборки (впервые увиденной здесь ). Этот путь оказался полезным, и я буду придерживаться его некоторое время, потому что

  1. Я не очень хорош в Python и
  2. он позволяет выполнять некоторые удобные задачи поиска и замены, такие как замена частей путей изображений и включаемых файлов на ходу.

Ниже приведена команда, которую я использую для создания слайд-шоу в формате Reveal.js (хотя эта и предназначена для загрузки на некоторый веб-хостинг, существуют другие варианты сборки для создания автономного файла слайд-шоу с использованием --self-containedпараметра pandoc или, например, «собрать» все файлы, относящиеся к слайд-шоу в папку на рабочем столе):

perl -ne 's/^#\\((.+)\\).*/`cat \"$\\$1\"`/e;s/\\((\\/_common\\/img)/(\\/presentations\\$1/g;print' $.md > result.md && pandoc -s -t revealjs --variable revealjs-url=http://www.site.com/presentations/_common/resources/revealjs --css=http://www.site.com/presentations/_common/resources/customcss_sky.css -H $/_common/resources/customhtml.html --highlight-style haddock result.md -o index.html && trash result.md

Эта команда:

  1. Заменяет все выражения # (путь / к / включить) (пути должны относиться к папке проекта) с содержимым include;
  2. Заменяет пути в изображениях (относительно папки проекта) на путь сервера к каталогу изображений;
  3. Вывод полученной уценки во временный файл;
  4. Создает слайд-шоу HTML с Pandoc;
  5. Удаляет временный файл trashутилитой Али Рантакари .