pandocは便利で手放せないが、LTSのディストロを使用したりすると、 更新が追いつかなくなる。
自前で環境を作るにも結構手間がかかるため、一度環境を作ってしまうと、 秘伝のタレのように使い続けてしまいがちになる。
そのため、PCを新調したり、OSを入れ替えたりすると環境の構築が面倒くさい。
Dockerイメージ使用して、比較的新しいpandocの環境を簡単に作れないか模索する。
縛りは下記の点。
Dockerを使う場合でも、野良のイメージを使うと継続的なメンテナンスが行われていないケースが多く、 結局秘伝のタレになりがちなため、公式が提供しているpandoc/coreなどのイメージを使用する。
pandoc/coreを使う
entrypointにpandocが設定されているため下記のように使うことができる。
$ docker run --rm \ --volume "$(pwd):/data" \ --user $(id -u):$(id -g) \ pandoc/core README.md -o outfile.html
--user
を設定することで、出力ファイルの所有権が実行時のユーザーとなるように配慮されている。
これをしないと軒並みroot:root
となるため、いちいちchownするのが面倒くさい。
dockerhubの例ではpdfを出力しようとしているが、 実際に試すと「pdflatex not found. Please select a different --pdf-engine or install pdflatex」となる。
下記のようなaliasを切っておくと、もうpandocそのもののように使える!(言い過ぎ)
alias pandock=\ 'docker run --rm -v "$(pwd):/data" -u $(id -u):$(id -g) pandoc/core'
このイメージのベースとなるOSはAlpineなので、比較的サイズが小さい。 Ubuntuベースのイメージも提供されている。
この状態でpandoc-crossrefは使用可能となっているらしい。
plantumlを使う
インターネッツを徘徊した結果このDockerfileが一番求めていたものに近そう。
frozenbonito/docker-pandoc-eisvogel-ja
下記の点でこれをベースに作業することにした。
- FROM行の
frozenbonito/pandoc-eisvogel-ja
はpandoc/latex
がベース - 行数が短く処理内容がシンプル
ただ、このDockerfileは下記の点でそのまま使用することはしない。
- FROMをpandoc/coreにしたい
- ユーザーがrootであることを前提としている部分がある
あと、ダウンロードサイトをみると、githubからダウンロードするのが筋が良さそう。 sourceforge.netでも提供してるみたいだけど。
Dockerfile
こんな感じでDockerfileを作成する。
FROM pandoc/core RUN apk add --no-cache \ graphviz \ openjdk11 \ python3 \ py3-pip \ ttf-droid \ ttf-droid-nonlatin ARG plantuml_version="1.2022.2" RUN wget https://github.com/plantuml/plantuml/releases/download/v${plantuml_version}/plantuml-${plantuml_version}.jar -O /opt/plantuml.jar RUN pip3 install --upgrade pip RUN pip3 install pandoc-plantuml-filter ENV PLANTUML_BIN="java -jar /opt/plantuml.jar" ENTRYPOINT [ "/usr/local/bin/pandoc" ]
適当にmypandoc
とかタグをつけてビルドする。
$ docker build . -t mypandoc
plantumlを使う
pandoc-plantumlフィルタがインストールされるので下記のように使用する。
$ docker run --rm \ --volume "$(pwd):/data" \ --user $(id -u):$(id -g) \ mypandoc \ README.md \ --filter pandoc-plantuml \ -o outfile.html
emacsのmarkdown-previewを使えるようにする
gfm-modeの機能としてmarkdown-preview
がある。
これはmarkdown-commandに設定されたコマンドが実行されると、編集中のmarkdownがhtmlに変換され、
その結果をブラウザで表示するものとなる。
その時に実行されるコマンドは標準入力からmarkdownを受け取り、標準出力にhtmlを吐き出す。
デフォルトではmarkdown-commandはmarkdown
と設定されているためPATHが通っているところに
markdownという名前のコマンドがあれば良いことになる。
markdownコマンドは次のような使い方が想定される。
$ markdown < README.md <h1 id="test">test</h1> <p>testtest</p>
markdownコマンドの内容は下記のようになる。
#!/bin/bash docker run --rm \ -i \ --volume "$(pwd):/data" \ --user $(id -u):$(id -g) \ mypandoc \ -s \ -o tmp.html cat tmp.html rm tmp.html
docker runの時に-i
コマンドで標準入力を受け付けるようにするところがポイントとなる。
一時ファイルtmp.html
を出力し、catすることでhtmlを標準出力に吐き出している。
cssなどを指定したい場合にはコンテナに予め取り込んでおくか、--volume
などでホスト上のファイルを
コンテナから参照できるようにする必要がある。
まとめ
Dockerを使用して比較的新しいpandocの環境を 比較的簡単に作成する方法を調べた。
余談だが、新し目のplantumlはエレメントのデフォルト色が、 あのなんとなく残念なクリーム色では無くなっている。
Dockerは意外と便利。