書きかけの記事です。

default template から template を作る

Define the user data directory to search for pandoc data files.

PANDOC_DATA_DIR=/home/blog/.local/share/pandoc
mkdir -p $PANDOC_DATA_DIR/templates
pandoc -D html5 > $PANDOC_DATA_DIR/templates/default.html5

mathjax つきにする。できたtemplate:

default.html5

ビルドするときに --mathjax=[URL] オプションを使用できるが、今回はテンプレートにハードコードする。

css を適用

github 風のやつ

style.css

$PANDOC_DATA_DIR/style.css に配置。

git post-commit に hook するコマンド

pandoc を使う方法と、vim と vimwiki を使う方法が考えられる。vim を使えばそこそこ再現ができるが、かなり時間がかかる。一方、pandoc はビルドが早いが、別ディレクトリに html を配置しようとすると画像の transclusion のパス解決が破壊されるし、そこを譲歩してマークアップと同じディレクトリにオブジェクトファイルを置いても、vimwiki の transclusion のシンタックス {{local:...}} の処理がうまく行っていなかったり、

<p><img src="file:imgs/data-2022-08-16/2022-08-16T15_34_28+09_00/delta_w.svg" alt=""> <img src="file:imgs/data-2022-08-16/2022-08-16T15_34_28+09_00/node.svg" alt=""> <img src="file:imgs/data-2022-08-16/2022-08-16T15_34_28+09_00/w.svg" alt=""></p>

interwiki link の拡張子の処理がうまく行かなかった (https://github.com/jgm/pandoc/issues/5414). 仕方がないので、いったん vimwiki でビルドすることにした。

vimwiki でビルド

コンテナイメージを作る

FROM alpine:3.16.2

RUN apk --no-cache add vim findutils && \
    mkdir -p /root/.vim/bundle && \
    mkdir /downloads && \
    cd /downloads && \
    wget https://github.com/vimwiki/vimwiki/archive/refs/tags/v2.5.tar.gz && \
    tar xvf v2.5.tar.gz -C /root/.vim/bundle && \
    cd /root/.vim/bundle && \
    rm -rf /downloads && \
    mv vimwiki-2.5 vimwiki.vim

COPY vimrc /root/.vimrc
COPY build.sh /bin/build.sh
#!/bin/sh -xv
# find ./ -name "*.wiki" -type f | xargs -o -I{} vim -n -c Vimwiki2HTML -c q "{}"
cd /vimwiki/vimwiki; find ./ -name "*.wiki" -type f | ( xargs -o -I{} /bin/sh -c '[ ! -f "../vimwiki_html/${1%.*}.html" -o "$1" -nt "../vimwiki_html/${1%.*}.html" ] && vim -n -c Vimwiki2HTML -c -q "$1"' -- {} )

下記を実行してビルド:

docker run --rm -it -v$(pwd):/vimwiki vimwiki /bin/build.bash

post-hook はこんな感じ:

#!/bin/bash -xv
cd /home/blog/vimwiki/vimwiki && \
git --git-dir=.git pull origin master && \
cd .. && \
docker run --rm -v$(pwd):/vimwiki vimwiki /bin/build.sh

今後の課題

  • VimwikiAll2HTML の relative transclusion のバグを直す (https://github.com/vimwiki/vimwiki/pull/1016)
  • 更新したソースだけ html に render するようにする (時間の短縮)
    • post-receive に組み込み変数として receive 前のコミットハッシュ等があればかんたんだが、なさそう。
    • pre-receive でその時のコミットハッシュを /tmp 当たりに記録しておいて、post-receive で diff を取る等が必要そう。
    • 排他制御・同期はどうする?自分一人しかコミットしないし無視でいいかも。

pandoc (動作しません)

pandoc -f vimwiki -t html5 -s --data-dir $PANDOC_DATA_DIR -H $PANDOC_DATA_DIR/style.css -o $DEST_HTML $SOURCE_WIKI
  • -s: スタンドアロンモード。<html> タグや <head> タグをテンプレートからつける。

hook のコマンド

hooks/post-receive

#!/bin/bash -xv
cd /home/blog/vimwiki/vimwiki && git --git-dir=.git pull origin master && $HOME/.local/bin/build_vimwiki_by_pandoc.bash

build_vimwiki_by_pandoc.bash

別のディレクトリに html を配置

#!/bin/bash -xv
IFS_ORG=$IFS
IFS=$(echo -en "\n\b")
PANDOC_DATA_DIR=/home/blog/.local/share/pandoc
for SOURCE_WIKI in $(find ./ -name '*.wiki'); do
    DEST_HTML="../vimwiki_html/${SOURCE_WIKI%.wiki}.html"
    pandoc -f vimwiki-tex_math_dollars -t html5 -s --data-dir $PANDOC_DATA_DIR --css $PANDOC_DATA_DIR/style.css -o "$DEST_HTML" "$SOURCE_WIKI"
done
IFS=$IFS_ORG

おそらく、画像の transclusion 等のパスの解決がうまくいかない。

同じディレクトリに html を配置

#!/bin/bash -xv
IFS_ORG=$IFS
IFS=$(echo -en "\n\b")
PANDOC_DATA_DIR=/home/blog/.local/share/pandoc
for SOURCE_WIKI in $(find ./ -name '*.wiki'); do
    DEST_HTML="../vimwiki_html/${SOURCE_WIKI%.wiki}.html"
    pandoc -f vimwiki-tex_math_dollars -t html5 -s --data-dir $PANDOC_DATA_DIR --css $PANDOC_DATA_DIR/style.css -o "$DEST_HTML" "$SOURCE_WIKI"
done
IFS=$IFS_ORG

未テスト。