Dateien in Markdown-Dokument mit Pandoc einschließen (außer Haskell)

3396
certainlyakey

Ich verwende Pandoc, um Reveal.js-Präsentationen aus Markdown-Dokumenten zu erstellen, nachdem ich von Google Slides gewechselt habe. Ich habe mich von Anfang an dafür entschieden, Präsentationen für verschiedene Veranstaltungen und Vorträge automatisch aus mehreren Dateien zusammenzufassen. Dadurch ist es einfacher, separate Folien zu verwalten, ohne dass der Inhalt an mehreren Stellen ständig aktualisiert werden muss.

Die Lösung kombiniert jetzt Codekit (mit seiner Kit-Sprache) und Pandoc. So werden einzelne Teile von Präsentationen in einem Editor vorbereitet und dann in einer einzigen .kitDatei mit @import-Anweisungen referenziert. Anschließend wird die resultierende Markdown-Datei von pandoc verarbeitet, wodurch eine HTML-Präsentation erstellt wird (der letzte Teil wird von Sublime Text Build System erstellt).

Ich möchte diesen Prozess irgendwie mit einem Skript vereinfachen, das automatisch eine kombinierte Markdown-Datei vorverarbeitet, sobald Pandoc sie frisst. Es gibt Beiträge zu StackExchange, die sich auf Haskell-Filter beziehen, aber die Installation von Haskell ist für mein kleines System viel zu groß (mindestens 800 MB).

Gibt es eine Möglichkeit, Dateien mit einer anderen Art von Programmiersprache oder Trick einzubinden? Ich weiß zum Beispiel, dass es möglich ist, mehrere Dateien durch Verketten ihrer Namen in einem Pandoc-Befehl zusammenzufügen. Dies macht den Arbeitsablauf jedoch nicht flüssiger oder schneller.

2

2 Antworten auf die Frage

1
John MacFarlane

Prinzipiell können Sie Pandoc-Filter in jeder Sprache schreiben, wobei Haskell besonders gut geeignet ist. Die pandocfilters- Bibliothek erleichtert das Schreiben in Python.

Hier ist ein Tutorial zu Pandoc-Filtern . Es enthält einen Haskell-Beispielfilter für Include-Dateien, der mit Pandoc-Filtern leicht in einen Python-Filter übersetzt werden kann.

Siehe auch das Verzeichnis der Beispiele im Repository von PandocFilters.

1
certainlyakey

Ich fand schließlich einige Möglichkeiten, um die Aufgabe zu erledigen.

Der erste besteht darin, einen in Python geschriebenen Pandoc-Filter zu verwenden, der Include einschließt (er funktioniert genauso wie der in Pandoc-Dokumenten beschriebene Haskell-Filter). Jetzt ist es jedoch nur für die Verwendung mit enthaltenen Codeblöcken und nicht für allgemeine Inhaltselemente geeignet.

Der zweite Weg ist Inline - Perl - Skript zu verwenden, die auf den Build - Befehl vorangestellt werden (zuerst gesehen hier ). Dieser Weg hat sich als nützlich erwiesen und ich werde da einige Zeit bleiben, weil

  1. Ich bin nicht wirklich gut in Python und
  2. Dadurch können einige praktische Such- und Ersetzungsaufgaben erledigt werden, z. B. das Ersetzen von Teilen der Pfade der Bilder und der enthaltenen Dateien unterwegs.

Nachfolgend finden Sie den Befehl, den ich zum Erstellen einer Diashow im Reveal.js-Format verwende (obwohl dieser für das Hochladen in ein Webhosting vorgesehen war, gibt es andere Build-Varianten zum Erstellen einer eigenständigen Diashow-Datei mit der --self-containedOption "Pandoc" oder beispielsweise "Sammeln" Sie alle Dateien, die sich auf die Diashow beziehen, in einem Ordner auf dem Desktop):

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

Dieser Befehl:

  1. Ersetzt alle # (Pfad / zu / Include) -Ausdrücke (Pfade müssen relativ zum Projektordner sein) durch Includes 'Inhalt;
  2. Ersetzt Pfade in Images (relativ zum Projektordner) durch Serverpfad zum Images-Verzeichnis.
  3. Gibt den resultierenden Markdown in eine temporäre Datei aus.
  4. Erstellt eine HTML-Diashow mit Pandoc.
  5. Verwischt die temporäre Datei mit dem trashDienstprogramm von Ali Rantakari .