web-dev-qa-db-ja.com

Pandocを使用してMarkdownドキュメントにファイルを含める(Haskellを除く)

Pandoc を使用して、Googleスライドから切り替えて、MarkdownドキュメントからReveal.jsプレゼンテーションを作成します。最初から、さまざまなイベントや講義のプレゼンテーションを複数のファイルから自動的に組み合わせることにしました。したがって、複数の場所でコンテンツを絶えず更新しなくても、別々のスライドを維持する方が簡単です。

今のところ、ソリューションは Codekit (キット言語を使用)とpandocを組み合わせています。したがって、プレゼンテーションの個々の部分はエディターで準備され、@ importステートメントを含む単一の.kitファイルで参照され、結果のMarkdownファイルはpandocによって処理され、HTMLプレゼンテーションが作成されます(最後の部分はSublimeによって実行されます)テキストビルドシステム)。

Pandocがそれを食べるたびに結合されたMarkdownファイルを自動的に前処理するある種のスクリプトを使用して、このプロセスを何らかの方法で単純化したいと思います。 StackExchangeにはHaskellフィルターを参照する投稿がありますが、Haskellのインストールは私の小さなシステムには大きすぎます(最低800Mb)。

他の種類のプログラミング言語やトリックでファイルを含める方法はありますか?たとえば、pandocコマンドで名前を連結することで複数のファイルを結合できることは知っていますが、それではワークフローがスムーズまたは高速になるわけではありません。

2
certainlyakey

私はついにその仕事をするいくつかの方法を見つけました。

1つ目は Pythonで記述されたpandocフィルターを含む (pandoc docsで説明されているHaskellフィルターと同じように機能します)を使用することです。ただし、現在は一般的なコンテンツではなく、含まれているコードブロックでのみ使用するように適合されています。

2番目の方法は、ビルドコマンドの前に追加できるインラインPerlスクリプトを使用することです(最初に見られるのは ここ )。このパスは有用であることが証明されており、しばらくはそれを使い続けます。

  1. 私はPythonと
  2. これにより、画像やインクルードファイルのパスの一部を外出先で置き換えるなど、いくつかの便利な検索と置換のタスクを実行できます。

以下は、Reveal.js形式でスライドショーを作成するために使用するコマンドです(これは一部のWebホスティングにアップロードすることを目的としていますが、pandocの_--self-contained_オプションを使用して自己完結型のスライドショーファイルを作成するための他のビルドバリアントがありますまたは、たとえば、スライドショーに関連するすべてのファイルをデスクトップ上のフォルダに「収集」します):

Perl -ne 's/^#\\((.+)\\).*/`cat \"${project_path/\\//\\\\\\//g}\\$1\"`/e;s/\\((\\/_common\\/img)/(\\/presentations\\$1/g;print' ${file_base_name}.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 ${project_path}/_common/resources/customhtml.html --highlight-style haddock result.md -o index.html && trash result.md

このコマンド:

  1. すべての#(path/to/include)式(パスはプロジェクトフォルダーからの相対パスである必要があります)をincludesの内容に置き換えます。
  2. (プロジェクトフォルダに対する)画像内のパスを画像ディレクトリへのサーバーパスに置き換えます。
  3. 結果のマークダウンを一時ファイルに出力します。
  4. Pandocを使用してHTMLスライドショーを作成します。
  5. ALiRantakariのtrashユーティリティを使用して一時ファイルを破棄します。
1
certainlyakey

Haskellは特に適していますが、原則として、任意の言語でpandocフィルターを作成できます。 pandocfilters ライブラリを使用すると、Pythonで簡単に記述できます。

これが pandocフィルターのチュートリアル です。これには、インクルードファイル用のサンプルHaskellフィルターが含まれています。これは、pandocfiltersを使用してpythonフィルターに変換するのは非常に簡単です。

Pandocfiltersリポジトリの examples のディレクトリも参照してください。

1
John MacFarlane