書きかけの記事です。
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:
ビルドするときに --mathjax=[URL]
オプションを使用できるが、今回はテンプレートにハードコードする。
css を適用
github 風のやつ
$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
未テスト。