【WordPress環境】highlight.jsで正しく文字を表示させる方法

デイトラの上級編でhighlight.jsを使ってブログでコードを綺麗に表示するという課題あります。
こちらですが、実は受講しているとき飛ばした記憶があり人に教える場面があってちょっと詰まったのでサボった自戒を込めてこちらの記事を書いていきます。

#本記事のゴール
ブログでコードを書いた際に、下記のように色を付けて表示させる。
![479474e80e70fc9648ad43ab3df2598f.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/592040/5f3a2272-714c-574b-2a61-a3c9be6c61ff.png)


#highlight.jsのインストールの方法
まずは、公式アカウントへアクセスします。
https://highlightjs.org/

![29d141822abef9fa6d44ce5d23dd49d8.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/592040/d024fa33-7ff4-1d29-0e9e-9241108abbe3.png)

Get Version XXXXXXからダウンロードします。
執筆時には`10.3.2`でしたが、変わっていくのでここが違っていても気にしなくて問題ありません。

ここで必要な言語を選びますが、デフォルトのままでOKかと思います。
![3b5171cf14b54cdf2d21da2d17eebc25.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/592040/f9a9bcab-c358-b282-5fb3-909d9cd31498.png)

下にスクロールするとダウンロードがでてくるのでダウンロードしてください。
![b96bd739b4679ee0e0b09a001887be34.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/592040/c2a0bb07-9d4c-9253-c679-21445e4eaa84.png)

必要なファイルは`highlight.pack.js`と`styles`のなかから一つ選んでください！
今回は、`tomorrow-night-eighties.css`を使用します。
![d295a6285e686768d148eab6ca3a5f36.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/592040/f5b535c6-79c1-7e6b-62f2-b871d209e3e6.png)

#読み込みを行う
WordPressでcssとjsの読み込みを行います。

```functions.php
  function my_script_init() {
    wp_enqueue_style('my', get_template_directory_uri() . '/css/style.css', array(), '1.0.0', 'all');
    wp_enqueue_style('my1', get_template_directory_uri() . '/css/tomorrow-night-eighties.css', array(), '10.3.2', 'all');
    wp_enqueue_script('my', get_template_directory_uri() . '/js/highlight.pack.js', array( 'jquery' ), '10.3.2', true);
    wp_enqueue_script('my1', get_template_directory_uri() . '/js/script.js', array( 'jquery' ), '1.0.0', true);
  }
  add_action('wp_enqueue_scripts', 'my_script_init');
```
ここでは、通常の`style.css`と`script.js`も読み込んでいます。
`script.js`に`hljs.initHighlightingOnLoad();`を追加します。
これで、`<pre><code>`で囲んだエリアをハイライトしてくれます。

![b1863ef1b69a2f1be04a5d4a48516791.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/592040/1e6e1443-af82-fa1a-7f73-cabfe6ebcc4d.png)


#コードを書いてみる
いまの状態としては、`<pre><code>`で囲むとハイライトされる状態になっています。

表示の確認のため下記のように記載
![7998e92e02602677b728c7f479c764e8.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/592040/46baeb7e-e9c4-0671-5c45-fee827b48c8f.png)

投稿画面から投稿
![b1863ef1b69a2f1be04a5d4a48516791.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/592040/22626acc-eda2-1548-9afa-5ea20166d6fc.png)

実際の表示。single.phpに直接書いた`<pre><code>ここにコードを記載</code></pre>`がハイライトして
表示されているのが分かるかと思います。
![3157c74b259dc6f3af624ba02ebe3562.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/592040/c0ba33c8-41f3-7199-a528-93e87749570b.png)

#ショートコードの作成
毎回`<pre><code>`と書くのもめんどくさいので、ショートコードを登録します。

```functions.php
function highlight_shortcode($class, $content = '')
{    //引数として$classと$contentを定義。
  return '<pre><code class = "' . $class['class'] . '">' . $content . '</code></pre>';    //引数で渡された$classと$contentが代入される。
}
add_shortcode('highlight', 'highlight_shortcode');
```
上記のように書くと、ショートコードに`[highlight class="html"]XXXXX[/highlight]` に記載すると
`<pre><code>`がはかれるように。引数のhtmlはcssやPHPなど中に表示するコードに合わせて書き換えてください。

#困ったこと
ショートコード に`[highlight class="html"]<div>ここに何か書きますよ</div>[/highlight]`を書いても、
`<div>`が表示されなくて困ったんですね。しかもなんか下に不要なものもついているし。。
![213378892ae34c882c1b8fbe809bc0d9.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/592040/119580f6-25c4-6497-de93-5afdd4136cef.png)

結論として、https://tech-unlimited.com/escape.html を使って、文字を変換すると正しく表示をすることができるようになりました。
![d5a86b53e813eadae7ca803208ffa77d.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/592040/2aef4ab6-cf44-4171-f6e4-aa443ca4ae41.png)

変換する
![8a35369fe0880eb9c43aaf04ceaa31d6.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/592040/9c48a9ea-b824-4651-f5d1-fa2443cc0be9.png)

表示。divが表示されるよになりました。
＊htmlの文字に重なっているが、これは`<br>`などで調整する。
![51d8376cc88fe597b2322188e81ca553.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/592040/d40ecd9e-8d7a-6fae-09b1-92ecc872721c.png)

#まとめ
これで、綺麗にコードを表示できるようになりました。
結構ややこしくて理解までに時間がかかりますが、少しずつやっていくしかないですね。

エスケープ処理ってイマイチ理解できていないので、もう少し勉強します。