michimani.net

Hugo で作成した記事内のコードブロックに Syntax Highlight CSS を当てる

2019-12-27

主に技術ブログを書く際に、コードやターミナルの出力結果をコードブロックとして表示したい場面があります。 今回は、 Hugo で作成したブログの記事内で、コードブロックに良い感じに Syntax Highlight CSS を当てる方法を整理してみます。

前提

Syntax Highlight 用の CSS を生成する

まずは Syntax Highlight 用の CSS を生成します。
といっても、下記のコマンドを実行するだけです。

$ hugo gen chromastyles --style=github > ./static/css/syntax.css

あとは、生成されたファイルを読み込むように ./themes/indigo/layouts/partials/head.html 内に下記を追記します。

<link rel="stylesheet" href="{{ .Site.BaseURL }}css/syntax.css" />

以上で Syntax Highlight の準備が整いました。

CSS 生成コマンドの --style=github の部分で、 Syntax Highlight のスタイル (Chroma Style) を指定しています。この部分を変更することで、さまざまなスタイルの Syntax Highlight を表現することができます。

スタイルの一覧は Chroma Style Gallery で確認できるので、好みのスタイルを探して --style オプションで指定します。

Markdown で装飾する

Markdown でコードブロックを表現する際には、下記のように記述します。 (Python のスクリプトの場合)

```python
import json

def lambda_handler(event, context):
    # TODO implement
    return {
        'statusCode': 200,
        'body': json.dumps('Hello from Lambda!')
    }
``` 

上の Markdown は下記のように表示されます。

import json

def lambda_handler(event, context):
    # TODO implement
    return {
        'statusCode': 200,
        'body': json.dumps('Hello from Lambda!')
    }

Hugo では、行番号を表示したり、特定の行に網掛けをつけることができます。

行番号を表示する

行番号を表示したい場合は、下記のような記述をします。

```python {linenos=true}
import json

def lambda_handler(event, context):
    # TODO implement
    return {
        'statusCode': 200,
        'body': json.dumps('Hello from Lambda!')
    }
``` 

上の Markdown は下記のように表示されます。

1import json
2
3def lambda_handler(event, context):
4    # TODO implement
5    return {
6        'statusCode': 200,
7        'body': json.dumps('Hello from Lambda!')
8    }

特定の行に網掛けをつける

特定の行に網掛けをつけたい場合は、下記のような記述をします。

```python {hl_lines=[1, 3, "5-8"]}
import json

def lambda_handler(event, context):
    # TODO implement
    return {
        'statusCode': 200,
        'body': json.dumps('Hello from Lambda!')
    }
``` 

上の Markdown は下記のように表示されます。

import json

def lambda_handler(event, context):
    # TODO implement
    return {
        'statusCode': 200,
        'body': json.dumps('Hello from Lambda!')
    }

もちろん、行番号表示との併用も可能です。

```python {linenos=true, hl_lines=[1, 3, "5-8"]}
import json

def lambda_handler(event, context):
    # TODO implement
    return {
        'statusCode': 200,
        'body': json.dumps('Hello from Lambda!')
    }
``` 
1import json
2
3def lambda_handler(event, context):
4    # TODO implement
5    return {
6        'statusCode': 200,
7        'body': json.dumps('Hello from Lambda!')
8    }

※Syntax Highlight のテーマによっては網掛けで見辛くなることがあります

また、 Syntax Highlight に対応した言語とその指定方法については Hugo の公式ドキュメントを確認してください。

まとめ

Hugo で作成したブログの記事内でコードブロックに良い感じに Syntax Highlight CSS を当てる方法について整理してみました。
静的サイトジェネレータは Markdown で簡単に記事が作成できる分、ちょっとした装飾や見た目のカスタムが地味に面倒だったりします。 Hugo のコードブロックについても、バージョン 0.60.0 より前では自分でショートコードを作って対応する必要がありました。
それが 0.60.0 以降では今回のように簡単にコードブロックを装飾できるようになったので、特に技術ブログでは恩恵を受けられると思います。

Markdown でブログか聞きたいけど、はてなとか WordPress は編集画面がもたつくし、そもそもページの表示も高速にしたい!という方はぜひ Hugo でブログ書きましょう。


comments powered by Disqus