はじめに
この記事はGitHubのコードを埋め込むテストのためのものです。
コード埋め込みというと、通常はバッククォート3つで囲い、Markdownに直接記述します。もちろんこれでも表示する上では問題ないのですが、少しもやっとします。プログラミングでコードを書き、さらにブログを執筆する際にもまだコードを書かなければならない。DRY原則 を忠実に守るためにも一度書いたコードを繰り返したくはありません。そこで、GitHubのコードを自動的に取得し、埋め込む仕組みを作ってみました。
なお、この仕組みはnkmkさんのhexo-tag-github-codeを参考にして作っています。コードを公開してくださり誠にありがとうございます。
様々な種類のコードをGitHubから持ってきてみる
Rustコードのサンプル
昔作った決定性有限オートマトンのRustによる実装を埋め込んでみます。話は逸れますが、Rustのパターンマッチングってものすごく便利ですよね。パターンマッチングのおかげで状態遷移図を何も考えずにそのまま転写するだけで実装できました。
オリジナルコード
1 | {% ghcode https://github.com/Tsutomu-Ikeda/rust-dfa/blob/master/src/main.rs 23 36 %} |
埋め込み結果
23 | impl fmt::Display for States { |
match を含めてすべての予約語がしっかりとハイライトされています。ただ変数名などはハイライトされていません。highlight.js の特性上あまり重い処理はできなさそうなので、しょうがないのでしょうか…
Pythonコードのサンプル
オリジナルコード
1 | {% ghcode https://github.com/selelab/admin/blob/master/api/accounting/models.py 14 30 %} |
埋め込み結果
14 | class Project(models.Model): |
Pythonも変数名がハイライトされていません。しかし、文字列リテラルや数値リテラルはしっかりと認識されているようです。
.zshrc のサンプル
.zshrc は頻繁に更新するファイルで、行がずれる恐れがあるため、コミットIDを指定して埋め込みました。
オリジナルコード
1 | {% ghcode https://github.com/Tsutomu-Ikeda/settings/blob/b487a295006849856deaa5ec646e1b7e23a5ea6f/unix/home/.zshrc 118 128 %} |
埋め込み結果
118 | export PATH="/usr/local/opt/mysql-client/bin:$HOME/.yarn/bin:$HOME/.config/yarn/global/node_modules/.bin:$HOME/.cargo/bin:$PATH" |
一見ちゃんとハイライトされているように見えて実はうまく行っていません。コメントは1行しかないはずなのにずっと続いていることになってしまっています。