テンプレートエンジンのnunjucksとhighlight.js組み合わせる

便利なテンプレートエンジンのnunjucksのテンプレートの中で、コードをシンタックスハイライト(色付け)する便利なライブラリのhighlight.jsを組み込む方法を紹介します。

nunjucksのコンパイルはgulpを使用しています。

gulpを使ったコンパイル方法はgulp-nunjucks-renderでNunjucksをgulpでコンパイルする方法で紹介しています。

また、ローカルでhighlight.jsでハイライトする方法はhighlight.jsをローカルで実行してハイライトされたファイルを出力で紹介していますので予備知識として目を通していただくと理解しやすいかと思います。

filter

highlight.jsでハイライトするフィルターを独自に定義します。gulpfile.jsに以下のように定義します。

var gulp = require('gulp');
var nunjucksRender = require('gulp-nunjucks-render');
var hljs = require('highlight.js');

gulp.task('nunjucks', function () {
  var manageEnvironment = function(env) {
    //独自のフィルターを定義します
    //str:ハイライトする文字列 type:ハイライトする言語
    env.addFilter('highlight', function(str, type) {
      return '<pre><code class="hljs">' + hljs.highlight(type, code).value + '`</pre>';
    });
  };
  var option = {
    envOptions: {
      //一応自動でエスケープをしないように設定します
      autoescape: false
    },
    manageEnv: manageEnvironment,
  };
  return gulp.src(src)
    .pipe(nunjucksRender(option))
    .pipe(gulp.dest(dest));
});

あとは、nunjucksのテンプレートファイルでハイライトしたいコードをフィルターブロックで囲めば、コンパイルするとハイライトしてくれます。

フィルターブロックで囲った文字列が第一引数に入ります。

filterのファインクションを定義する際の引数にはハイライトしたい言語タイプを設定します。 コンパイル前

{% filter highlight('html') %}
トマトは<span style="color:red;">赤い</span>
{% endfilter %}

コンパイル後

<pre><code class="hljs">トマトは<span class="hljs-tag">&lt;<span class="hljs-name">span</span> <span class="hljs-attr">style</span>=<span class="hljs-string">"color:red;"</span>&gt;</span>赤い<span class="hljs-tag">&lt;/<span class="hljs-name">span</span>&gt;</span>。`</pre>

自動でエスケープもしてくれます。これでとても簡単にコードをハイライトできるようになりました。

nunjucksは日本語の資料があまりないので、日本ではあまり普及していないのかもしれませんが、上記のようにフィルターブロックを使えたりと、とても便利な機能がたくさんあるので、テンプレートエンジンの中では一番のお気に入りです。


関連記事

  • Nunjucksで独自のファンクションを実行する

    Nunjucksのテンプレートファイルに独自に定義した別ファイルのファンクションを実行する方法を紹介します。gulpでコンパイルする場合を想定しています。gulp-nunjucks-renderでNu...


  • Nunjucksの基本的な使い方 -extends,block,include-

    htmlのおすすめテンプレートエンジンNunjucksがとても便利なのですが、日本語のページがほとんど見当たらなかったので、基本的な使い方を紹介します。ホームページを作成していると、htmlのヘッダと...


  • gulp-nunjucks-renderでNunjucksをgulpでコンパイルする方法

    Nunjucksの基本的な使い方 -extends,block,include-で紹介したNunjucksをgulpでコンパイルする方法を紹介します。gulpの基本的な使い方についてはgulp|gul...


  • Front Matterでファイルごとに変数を持たせる

    ejsやnunjucksなどのテンプレートエンジンを使用して、ホームページやブログを作成している場合、共通のテンプレートファイルに変数などを定義しておき、各ファイルではその変数に値をセットして、htm...


  • watchifyとgulpで自動コンパイルと差分更新をおこなう

    vuejsの開発環境を構築するでvueをビルドする環境を作成しました。今回は開発環境をさらに便利にするために、ファイルが変更されたら自動でビルドを実行し、ブラウザをリロードする処理を実装します。開発用...


  • swig|htmlのヘッダ・フッタの共通化などで実装を効率化する

    swigでhtmlの実装すれば、htmlのヘッダーやフッターの共通化などができ、htmlの管理・実装の効率が格段に上がります。swigとは、テンプレートエンジンの1つで、htmlの中に変数やif文やf...


  • 拡張メタ言語を使用して静的ホームページを簡単に作成する

    ちょっとしたホームページやブログを作成するとき、どのように作成しているでしょうか?最初はhtmlやcssをそのままテキストエディタなどで書いて作成していたが、ページ数が多くなるにつれ管理が大変になり、...


  • npmのpackage.jsonを最新のバージョンに更新する

    package.jsonのパッケージを最新のバージョンに更新する方法を紹介します。npmは以下のコマンドを実行すれば、package.jsonに記載されているバージョンに更新されます。最新のバージョン...


  • less|cssに変数を使い実装を効率化する方法

    ホームページを作っていて、規模が大きくなっていくにつれ、気をつけていてもcssのソースはグチャグチャになってしまい、後で見返したときに「これはどこのスタイルだっけ?」となってしまうことがあると思います...


  • gulpの便利なタスク gulpfile.jsの記述例

    gulpの便利なおすすめプラグインで紹介したプラグインなどを利用したgulpの便利なタスクの実装例を紹介します。less,js,htmlのコンパイルや軽量化、watchとlivereload、エラー時...