highlight.jsを使ってソースコードをきれいに表示させる方法
highlight.jsを使ってソースコードをきれいに表示させる方法です。
「highlight.js」を採用しようと思った理由は、シンタックスハイライト機能として定評があり、継続的に新バージョンが提供されていることがあげられる。使い方は、ファイルをダウンロード(もしくはCDN経由)して読み込み、初期化の記述をするだけで、とても簡単に導入できるのが特徴だ。カスタマイズについても、比較的簡単にできるのはうれしい。
ここでは highlight.jsを使ってソースコードをきれいに表示させる方法 を紹介します。
目次
Highlight.jsのバージョン
現在の新バージョンは、11.9.0となっている。
バンドルされている言語
highlight.min.js(v.11.9.0)にバンドルされている Common カテゴリーの言語は下記の通り。
言語 | クラスの指定 |
---|---|
Bash | bash |
C | c |
C++ | cpp |
C# | csharp |
CSS | css |
Diff | diff |
Go | go |
GraphQL | graphql |
INI | ini |
Java | java |
JavaScript | javascript |
JSON | json |
Kotlin | kotlin |
Less | less |
Lua | lua |
Makefile | makefile |
HTML, XML | xml |
Markdown | markdown |
Objective-C | objectivec |
Perl | perl |
PHP | php |
PHP Template | php-template |
Plain text | plaintext |
Python | python |
Python REPL | python-repl |
R | r |
Ruby | ruby |
Rust | rust |
SCSS | scss |
Shell Session | shell |
SQL | sql |
Swift | swift |
TypeScript | typescript |
Visual Basic .NET | vbnet |
WebAssembly | wasm |
YAML | yaml |
Highlight.jsを導入する方法
Highlight.jsの導入には、CDN経由、ダウンロード、ES6 モジュール(npm インストール)、Vue プラグインなどの方法がある。
CDN経由で読み込み
もっとも簡単なのは「CDN経由」で読み込みすることだ。下記のコードを貼り付ければOK。
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/highlight.js/11.9.0/styles/default.min.css">
<script src="https://cdnjs.cloudflare.com/ajax/libs/highlight.js/11.9.0/highlight.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/highlight.js/11.9.0/languages/go.min.js"></script>
<script>hljs.highlightAll();</script>
「hljs.highlightAll()」を実行するコードを書くのを忘れずに。
ダウンロードしてローカル配置する
2つ目としてはダウンロードして、ローカル配置する方法だ。「PageSpeed Insights」のパフォーマンスにも影響することから、筆者はこの方法をとっている。
まずは、下記のURLからダウンロードページへ移動する。
https://highlightjs.org/download
「Select all languages」のチェックをオンにして、「Download」ボタンを押すと「highlight.zip」がダウンロードされる。
ZIPファイルを解凍すると下図のような状態となっている。このままサイト内へ配置しよう。
WordPressのテーマに記述するには、下記のコードを貼り付ければOK。
<link rel="stylesheet" href="<?php echo get_template_directory_uri(); ?>/js/highlight/styles/atom-one-dark.min.css">
<script src="<?php echo get_theme_file_uri('/js/highlight/highlight.min.js'); ?>"></script>
<script>hljs.highlightAll();</script>
「hljs.highlightAll()」を実行するコードを書くのを忘れずに。
ここでは、Highlight.jsのテーマに「atom-one-dark.min.css」の読み込みを指定している。styleフォルダ内にあるCSSを指定すれば、Highlight.jsテーマを変更できる。
下記のページでHighlight.jsのテーマのデモが見れるので、自分のサイトにあったテーマを探してみるといいかも。
Highlight.jsの使い方
初期設定が終わったら、早速Highlight.jsを使ってみよう。
ハイライト表示する
Highlight.jsは、「<pre><code>〜</code></pre>」で囲まれたコードはハイライト表示される。
つまり、下記のコードを書くと、
<pre><code>function gethoge() {
return "hoge";
}
console.log(gethoge()); // hoge
</code></pre>
このように表示される。
function gethoge() {
return "hoge";
}
console.log(gethoge()); // hoge
クラスの指定
Highlight.jsが便利なのは、言語を自動的に検出してくれるところだ。ただし、自動検出が正しくない場合もあるため、明示的に言語を指定したいときには、codeタグに「language-言語名」という形式でクラスを指定することができる。
例えば、「JavaScript」と指定するには、codeタグに language-javascript」のクラスを指定すればOK。
<pre><code class="language-javascript">function gethoge() {
return "hoge";
}
console.log(gethoge()); // hoge
</code></pre>
「language-javascript」クラスが指定されたことで、表示が変わった。
function gethoge() {
return "hoge";
}
console.log(gethoge()); // hoge
HTML特殊文字はエスケープする
以下の「HTML特殊文字」は、エスケープしないと表示できない。
表示 | 記号 |
---|---|
< | &lt; |
> | &gt; |
& | &amp; |
' | &#39; |
" | &quot; |
手動で変換するのは大変なので、エディタで一括置換するか、HTML特殊文字変換ツールなどを利用して対応するといいかも。
ハイライト表示しない
ハイライト表示せずに、プレインテキストとして表示するには、codeタグに「language-plaintext」クラスを指定する。
<pre><code class="language-plaintext">Plain Text</code></pre>
こうなる。
Plain Text
ハイライトを無効にする
ハイライトを無効にするには、codeタグに「nohighlight」クラスを指定する。
<pre><code class="nohighlight">No Highlight</code></pre>
こうなる。
No Highlight
行番号を表示する
行番号を表示するには「highlightjs-line-numbers.js」というプラグインをダウンロード(またはCDN)する必要がある。
https://github.com/wcoder/highlightjs-line-numbers.js/
使い方は、Highlight.jsの読み込みの後に、highlightjs-line-numbers.min.jsを読み込むだけ。初期設定の「hljs.highlightAll()」の後に「hljs.initLineNumbersOnLoad()」を記述すればOK。
<script src="<?php echo get_theme_file_uri('/js/highlight/highlight.min.js'); ?>"></script>
<script src="<?php echo get_theme_file_uri('/js/highlight/highlightjs-line-numbers.min.js'); ?>"></script>
<script>hljs.highlightAll(); hljs.initLineNumbersOnLoad();</script>
指定した行をハイライトする
highlightjs-line-numbers.jsを使うと指定した行をハイライトすることができる。pre要素に「data-line-highlight」属性を設定し、ハイライトする行を指定すればOK。
<div class="hljs-wrap">
<pre data-line-highlight="1, 3-5"><code>...</code></pre>
</div>
ちなみに「highlightjs-line-numbers.js」は、コードをtable要素を使って整形し、各行はtr要素でマークアップされて出力されるため、筆者は使っていない。
レイアウトシフトを防止する
Highlight.jsを使うと、コード周りの余白や文字サイズが変わるため、画面上のレイアウトがずれる現象が発生する。GoogleのUX指標でいうところの「CLS(Cumulative Layout Shift)」、レイアウトシフトという現象ですな。
CLSが0.25超えとなると、ページエクスペリエンスが「不良」となり、検索結果へ影響する。
なので、それを防止するコードをCSSへ記述しておく。
/**
Highlight.js
レイアウト・シフトを防止する
**/
pre code {
display: block;
overflow-x: auto;
padding: 1em;
line-height: 1.3em;
font-size: .9rem;
}
やっていることは、highlight.js が実行される時点で追加される「大きさに関する項目」を、ページ表示の時点で適用した状態にしているだけ。
まとめ
highlight.jsを使ってソースコードをきれいに表示させる方法を紹介しました。
ここで紹介した方法を基本として、いろいろなカスタマイズができるんだけど、筆者はそこまで必要としていないので別のサイトにお任せです。
現在、WordPressプラグインである「SyntaxHighlighter Evolved」を使ってソースコードをきれいに表示している。だけど、レイアウトシフトが発生してページエクスペリエンスが「不良」となっている。このため、highlight.jsを導入して回避したいと考えている。
この辺りは別の機会に紹介する予定。
おつかれさまでした。